Javascript自我执行应该工作?

时间:2011-11-02 10:57:01

标签: javascript syntax

我有这段代码:

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);

我的意思是哪里()的包装?

2 个答案:

答案 0 :(得分:4)

编译器需要区分函数声明语句和函数定义表达式。你只能在表达式中调用函数。

当关键字功能出现 = '或''时,编译器知道这必须是函数定义表达式(因为在'='或'(')之后只允许使用表达式而不是语句,并允许您立即调用。当关键字函数开始一个新语句,编译器认为它是一个函数声明语句,因此你不能立即调用该函数

请注意,函数声明语句要求您命名该函数。这允许您稍后调用它。您可以省略函数定义表达式中的函数名称(您可以立即调用它们)。

被修改

所有粗体字都是由Royi Namir制作的OP:那些大胆的字是理解的关键。

this is the most logical Explanation after a lot of tests.

参见本

http://jsbin.com/imetan/edit#javascript,html

答案 1 :(得分:0)

(i)部分将i的值作为参数传递给匿名函数(没有名称的函数),该函数被声明为onclick事件处理程序,这就是全部。它并没有真正“做”任何事情。

抱歉,我已经更正了...... (i) 正在执行传递i作为参数的函数。这导致onclick实际上是这样的功能:

function (num) {
    alert(num);
};

如果您尝试从函数中访问变量i,您将始终以其最终值结束,在这种情况下为5。