您在这里遇到了一些不同的事情,但我会先尝试解决您的主要问题。
一般来说....
function() { ... }
是一个函数表达式。2
从语法上讲,这与or处于同一级别[4,5]
。这代表一个值。因此var foo=function(){ ... }
,每次都会按计划进行。
function foo() { ... }
是一个函数声明。这似乎与 做同样的事情var foo=function(){...}
,但有一个小警告。作为一个声明,它的工作方式类似于 JS 中变量提升的概念(基本上,所有变量声明都是在计算任何表达式之前完成的)。
一个很好的例子来自这里:
function test() {
foo(); // TypeError "foo is not a function"
bar(); // "this will run!"
var foo = function () { // function expression assigned to local variable 'foo'
alert("this won't run!");
}
function bar() { // function declaration, given the name 'bar'
alert("this will run!");
}
}
test();
基本上变量提升已将值提升到顶部,因此此代码(理论上)等效于:
function test() {
var foo;//foo hoisted to top
var bar=function(){//this as well
alert("this will run!");
}
foo(); // TypeError "foo is not a function"
bar(); // "this will run!"
var foo = function () { // function expression assigned to local variable 'foo'
alert("this won't run!");
}
}
注意:我想借此机会说 JS 解释器很难遵循理论,因此不建议在有些不确定的行为上相信他们。在这里,您会在一节的末尾找到一个很好的例子,理论和实践最终都不起作用(还有一些关于表达式与声明主题的更多细节)。
有趣的事实:function foo() {...}
用括号括起来会将它从声明转换为表达式,这可能会导致一些看起来很奇怪的代码,例如
(function foo() { return 1; })();// 1
foo; //ReferenceError: foo is not defined
如果没有理由,请不要这样做。
摘要 var foo=function(){ ... }
*sorta * 与 function 相同,foo(){ ... }
只是前者在你认为它应该做的地方做你认为它应该做的事情,而后者做一些奇怪的事情,除非你将它包装在括号中,但这会弄乱范围,并且 JS 解释器允许你做一些在规范中被认为是语法错误的事情,所以你被引导相信错误的事情实际上是正确的,等等......
请使用函数表达式( var f=function(){...}
)。没有真正的理由不这样做,尤其是考虑到当您使用点语法时您有些被迫这样做。
关于你触及的第二件事......
我真的不知道该说什么,这有点与其他关于此的事情完全不同。
var foo = {
baz: 43,
doSomething:function() {
...
}
}
这被称为对象字面量语法。基于这种语法的 JSON 是一种非常简洁的数据格式化方式, JS 中的这种语法通常用于声明新对象,例如单例对象(避免声明函数和使用 new 的所有混乱) . 它也可以以与使用 XML 相同的方式使用,并且是所有酷孩子的首选...
无论如何,基本上对象字面量语法是这样工作的:
{ name1: val1, .... namek:valk }
这个表达式是一个对象,上面初始化了某些值。这样做var obj={ name1: val1, .... namek:valk }
意味着:
obj.name1==val1;
obj['name1']==val1;// x['y'] is the same thing as x.y
...
obj.namek==valk;
那么这与我们的例子有什么关系呢?基本上,您的表达式通常用于声明单例对象。但是它也可以用来声明一个对象原型,所以以后有人可以做 var newObj=Object.create(foo) ,newObj 就会有 foo 作为原型。
如果您想真正了解原型继承的用途,请仔细研究它。道格拉斯·克罗克福德(Douglas Crockford )在他的众多演讲之一中详细讨论了它)。