Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript自动执行应该可以工作吗?_Javascript_Syntax - Fatal编程技术网

Javascript自动执行应该可以工作吗?

Javascript自动执行应该可以工作吗?,javascript,syntax,Javascript,Syntax,我有这个密码: function (i) { alert(i); }(3); 但它不起作用,所以在回答问题后,我把它改为: (function(i){ alert(i); })(3); 它是有效的 我必须把所有的代码都包装起来 但后来我在另一个网站上看到了这段代码: function addLinks () { for (var i=0, link; i<5; i++) { link = document.createElement("a");

我有这个密码:

function (i)
{
    alert(i);
}(3);
但它不起作用,所以在回答问题后,我把它改为:

 (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;
函数addLinks(){
对于(var i=0,link;i而言,
(i)
部分将
i
的值作为参数传递给匿名函数(没有名称的函数),该函数声明为
onclick
事件处理程序,仅此而已。它实际上没有“做”任何事情

对不起,我已更正。
(I)
正在执行将
I
作为参数传递的函数。这导致
onclick
实际上就是这样的函数:

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

如果您试图像这样从函数中访问变量
i
,那么最终的结果总是它的最终值,在这种情况下为5。

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

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

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

编辑 所有的粗体字体都是由Royi Namir制作的:这些粗体字是理解的关键

this is the most logical Explanation after a lot of tests.
看到这个了吗

可能的重复不是重复;另一个没有问(答案也没有解释)为什么
link.onclick=function(num){…}(i)
不需要将函数用括号括起来,这在我看来是主要问题。我想我找到了问题:var t=function(){alert('1')}();
只需编写:
function(){alert('1')}()
你能解释一下原因吗?事实上,这与我提出的问题中描述的问题是重复的问题是一样的,而公认的答案确实涵盖了这一情况——只是在作业的右侧是另一个只有表达式才能表达的地方。问题和公认的答案似乎没有关联(无论它们实际上有多关联).有一条评论暗示了这个问题的答案,但仅此而已。任何人提出这个问题并看到答案都会失望。这里的值将是1,2,3,4,5,因为有闭包…我已经测试过了。等等。它确实起到了作用。我想我找到了问题:
var之间存在差异t=function(){alert('1')}();
只写:
function(){alert('1')}();
你能解释一下为什么吗?不过JS通常不关心返回值。(如果你不把它放在变量中,它会很高兴地丢弃返回值。)那么它为什么关心这个呢?你是指在这段代码中
function(){alert('1')}()
?因为它的语法错误。当函数没有名称时,必须首先将其分配给变量,或者使用
包装器自我调用,以告诉JIT编译器“我是独立块”JavaScript编译器?JavaScript是被解释的,而不是被编译的。大多数现代JS实现在运行脚本之前编译脚本。现在编译语言和解释语言之间的界线变得模糊了很多。+1是最容易混淆和最符合逻辑的解释:)