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是最容易混淆和最符合逻辑的解释:)