你在这里碰到了几个不同的问题,但我会先回答你的主要问题。
一般来说。。。。
函数(){…}
是一个函数表达式从语法上来说,这与2
或[4,5]
。这表示价值.这么做var foo=函数(){…}
每次都会按计划进行。
函数foo(){…}
是一个函数声明。这可能与var foo=函数(){…}
,但有一个小小的警告。作为一个声明,它的工作原理类似于JS中的变量提升概念(基本上,所有变量声明都是在计算任何表达式之前完成的)。
一个很好的例子来自在这里:
功能测试(){foo();//TypeError“foo不是函数”bar();//“这会跑的!”var foo=赋给局部变量“foo”的函数(){//函数表达式alert(“这不会运行!”);}function bar(){//函数声明,名称为“bar”alert(“这将运行!”);}}测试();
基本上,可变起重已将值提升到最高,因此该代码是等效的(理论上)收件人:
功能测试(){变量foo//foo吊装至顶部var bar=function(){//这也是alert(“这将运行!”);}foo();//TypeError“foo不是函数”bar();//“这会跑的!”var foo=赋给局部变量“foo”的函数(){//函数表达式alert(“这不会运行!”);}}
注:我想借此机会说,JS口译员很难理解理论,所以不建议相信他们有点可疑的行为。在这里在一节的末尾,您会发现一个很好的例子,理论和实践最终都不起作用(还有关于表达式与声明主题的更多细节)。
有趣的事实:包装函数foo(){…}
在括号中,将它从声明转换为表达式,这可能会导致一些奇怪的代码,如
(函数foo(){return 1;})();//1foo//ReferenceError:未定义foo
如果你没有理由,请不要这样做。
总结 var foo=函数(){…}
有点像函数吗foo(){…}
除了前者做了你认为应该做的事情,而后者做了奇怪的事情,除非你把它包装在parens中,但这弄乱了范围,JS解释器允许你做规范中被认为是语法错误的事情,所以你会认为错误的事情实际上是正确的,等等。。。。
请使用函数表达式(var f=函数(){…}
). 没有真正的理由不这样做,尤其是考虑到当您使用点语法时,您有点被迫这样做。
关于你碰到的第二件事。。。。。
我真的不知道该说什么有点像这与其他事情完全不同。
变量foo={baz:43,doSomething:函数(){...}}
这就是所谓的对象文字语法。基于此语法的JSON是格式化数据的一种非常简洁的方法JS中的这种语法通常用于声明新对象,例如单例对象(避免了声明函数和使用new时的所有混乱)。它也可以以与XML相同的方式使用,是所有酷孩子的首选。。。
无论如何,基本上对象文字语法的工作原理如下:
{name1:val1,….namek:valk}
这个表达式是一个对象,上面初始化了某些值var对象={name1:val1,….namek:valk}
意味着:
obj.name1==val1;对象['name1']==val1;//x['y']和x.y是一回事...对象名称==valk;
那么这与我们的例子有什么关系呢?基本上,表达式通常用于声明单例对象。但它也可以用于声明对象原型,因此有人可以稍后执行var newObj=object.create(foo),newObj将foo作为原型。
如果你想真正了解它的用处,请仔细研究原型继承。道格拉斯·克罗克福德在一他多次演讲中)。