我有这段代码:
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);
我的意思是哪里是()的包装?
答案 0 :(得分:4)
编译器需要区分函数声明语句和函数定义表达式。你只能在表达式中调用函数。
当关键字功能出现后 = '或'('时,编译器知道这必须是函数定义表达式(因为在'='或'(')之后只允许使用表达式而不是语句,并允许您立即调用。当关键字函数开始一个新语句,编译器认为它是一个函数声明语句,因此你不能立即调用该函数。
请注意,函数声明语句要求您命名该函数。这允许您稍后调用它。您可以省略函数定义表达式中的函数名称(您可以立即调用它们)。
this is the most logical Explanation after a lot of tests.
答案 1 :(得分:0)
(i)
部分将i
的值作为参数传递给匿名函数(没有名称的函数),该函数被声明为onclick
事件处理程序,这就是全部。它并没有真正“做”任何事情。
抱歉,我已经更正了...... (i)
正在执行传递i
作为参数的函数。这导致onclick
实际上是这样的功能:
function (num) {
alert(num);
};
如果您尝试从函数中访问变量i
,您将始终以其最终值结束,在这种情况下为5。