我有这段代码:
function (i)
{
alert(i);
}(3);
它不起作用,所以在 StackOverFlow 问题之后 - 我将其更改为:
(function(i){ alert(i); })(3);
而且有效。
我必须() 包装所有代码。
但后来我在其他网站上看到这段代码:
function addLinks () {
for (var i=0, link; i<5; i++) {
link = document.createElement("a");
link.innerHTML = "Link " + i;
link.onclick = function (num) {
return function () {
alert(num);
};
}(i); // <=== What about this ? there is no () wrapper... so how does it work ?
document.body.appendChild(link);
}
}
window.onload = addLinks;
我想问一下 (i)
部分的作用是什么? 是否正在执行某事?
如果它可以,为什么它不是以下模式:
(function(i){ alert(i); })(3);
我的意思是哪里是()的包装器?
最佳答案
编译器需要区分函数声明语句和函数定义表达式。您只能在表达式中调用函数。
当关键字 function 出现在 '=' 或 '(' 之后,编译器知道这必须是一个函数定义表达式(因为在'='或'(')之后只允许表达式而不是语句并允许您立即调用它。当关键字函数开始一个新语句,编译器假定它是一个函数声明语句,因此您不能立即调用该函数。
请注意,函数声明语句要求您为函数命名。这允许您稍后调用它。您可以在函数定义表达式中省略函数名称(您可以立即调用它们)。
已编辑
所有粗体字都是由 OP 的 Royi Namir 制作的:那些粗体字是理解的关键。
this is the most logical Explanation after a lot of tests.
看这个
关于Javascript 自执行应该工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7979184/