Javascript 自执行应该工作吗?

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

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

最佳答案

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

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

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

已编辑

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

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

看这个

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

关于Javascript 自执行应该工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7979184/

相关文章:

syntax - VBscript 中的函数是否接受可变数量的参数?

javascript - 如何禁用 .select2() javascript?

javascript - 如何使用 JavaScript 从表格中获取单元格的数据

javascript - 性能 : Calculating Div Positions

MySQL - 选择日期 < X

c# - 在循环中获取每第 100 个值

javascript - 在响应式设计中按比例裁剪图像?

javascript - 如何强制浏览器重绘图像?

c# - 返回数组而不创建变量

java - this 和 Activity.this 有什么区别