Javascript中的自调用函数

ash*_*man -4 javascript

有人可以解释为什么代码执行,但当我检查错误持续说

"未捕获的TypeError:undefined不是函数"

当我做

(alert("hi"))();
Run Code Online (Sandbox Code Playgroud)

Mat*_*and 5

这个

(alert("hi"))();
Run Code Online (Sandbox Code Playgroud)

不是自我调用的函数.这将是一个自我调用的函数:

(function(){alert("hi");})();
Run Code Online (Sandbox Code Playgroud)

请注意它是如何的function.

第一种情况,你试图调用返回的内容alert.不幸的是,警报返回undefined,所以你实际做的是:

alert("hi");
undefined();
Run Code Online (Sandbox Code Playgroud)

正如错误所说, undefined is not a function

后者几乎(但不完全)等同于做这样的事情:

function foo() {
   alert("hi");
}
foo();
Run Code Online (Sandbox Code Playgroud)

但是允许您立即调用匿名函数而不必为其命名.

注意:如果alert您没有调用返回函数的函数,那么您的原始语法将完全有效(如果有点难以阅读).例如,您可以这样做:

function myalert(str) { 
    return function() { alert(str); }
};

(myalert("hi"))();
Run Code Online (Sandbox Code Playgroud)

但是你的额外括号是完全没必要的,因为你可以很容易地做到:

myalert("hi")(); 
Run Code Online (Sandbox Code Playgroud)