4

如果我声明一个函数文字:

var x = function(){
        alert('hi');
    };
    console.log(x); // returns the function code.

然而:

var x = (function(){
    alert('hi');
})();

console.log(x); // returns undefined?

我不明白为什么会这样。将函数编写为文字的目的不是仍然能够通过其变量引用名称访问它吗?我知道这可能很愚蠢,但我只是在学习 javascript,所以不要太苛刻地判断。

4

2 回答 2

8

您的函数不返回任何内容,因此它的返回值为undefined.

执行自执行函数并且该函数不存储在任何地方 - 只有它的返回值存在(以及函数设置/修改的任何外部变量)。

例如,此代码将等效于var x = 'hi';

var x = (function(){
    return 'hi';
})();

自调用函数的目的通常是创建一个新范围,例如在循环中创建回调函数时:

for(var i = 0; i < 5; i++) {
    window.setTimeout(function(){ alert('i = ' + i); }, 1000 * i);
}

这将i在所有回调中使用相同的,因此它会警告i = 55 次。

for(var i = 0; i < 5; i++) {
    (function(i) {
        window.setTimeout(function(){ alert('i = ' + i); }, 1000 * i);
    })(i);
}

通过使用自执行函数,我们创建了一个新范围,因此i在每个循环中都创建了一个新范围。

自执行函数的另一个用途是创建一个新作用域,其中确保某些变量可用并设置为正确的值:

(function($, window, undefined) {
    // here the following always applies:
    // $ === jQuery
    // window === the global object [assuming the function was executed in the global scope]
    // undefined is well, undefined - in some js engines someone could have redefined it
})(jQuery, this);
于 2012-05-30T14:36:20.930 回答
5

如果你:

var foo = somefunction;

...然后您将功能分配给foo.

如果你:

var foo = somefunction();

…然后将函数调用的返回值分配给foo

你的功能:

function(){
    alert('hi');
}

... 没有return声明,所以它会返回undefined.

于 2012-05-30T14:37:48.963 回答