1

我读了很多关于这个论点的页面,但仍然不明白为什么会这样(声明)

function foo() {console.log("foo");}

(function(){
  // Really there is nothing here
})();

什么都不做,而这个(表达式)

var foo = function() {console.log("foo");}

(function(){
  // Really there is nothing here
})();

输出

未捕获的类型错误:未定义不是函数

这是怎么回事?

4

2 回答 2

2

正如 Felix Kling 指出的那样,您在分配后缺少分号。

第二个匿名函数周围的括号将被解释为函数调用参数周围的括号:

var foo = function() {console.log("foo");}(function(){ })();

表达式function() {console.log("foo");}(function(){ })将返回undefined,因为第一个函数中没有 return 语句。最后一对括号将使其成为另一个函数调用,但由于undefined不是函数,您会收到特定的错误消息。

于 2012-08-27T14:22:34.260 回答
1

这就是为什么分号不应该是可选的情况。空白只是为了让我们更容易阅读。编码:

var foo = function() {console.log("foo");}

(function(){
    // Really there is nothing here
})();

看起来像这样

var foo = function() {console.log("foo");}(function(){})();

使它看起来像一个命名函数调用

myFunction(function(){})();

或者

myFunction("some code")();

第一个函数myFunction("some code")返回未定义,然后您尝试运行该函数。

~undefined~();

所以随着那里的回报。

var foo = function() {console.log("foo"); return undefined;}(function(){})();

如果您返回一个函数,代码将运行良好

var foo = function() {console.log("foo"); return arguments[0];}(function(){return "hello"})();
于 2012-08-27T14:23:56.097 回答