[英]javascript strange behavior needed explanation
for(i=0; i< 3; i++){
(function(i){
console.log(i)
})(i);
}
我已经遇到了这个问题,并且想知道它是如何工作的(我理解结果,只想对(function(i){})(i)
以及它的名字有更深入的解释。非常感谢!!!
(function(i){
console.log(i)
})(i);
这就是所谓的自执行匿名函数,也就是您不必命名的函数。 定义后也立即执行。 如果查看第一组括号,它们将包裹function关键字,参数列表和函数定义,而第二组括号是您传递参数的位置。
/* self-executing anonymous function definition */
( function(i){
console.log(i)
}
)
/* pass argument i into the anonymous function and execute */
(i);
我用空格将其拆分开了一些,以便在视觉上更容易分解。
现在,由于函数参数和自变量具有相同的名称,因此对于第一次看到此名称的人来说,此定义可能会造成混淆。 所以这是相同的示例,除了我们只是将实际值传递给函数:
(function(i){
console.log(i) // prints '5'
})(5);
代码部分:
(function(i){
console.log(i)
})(i);
是所谓的IIFE(立即调用函数表达式)。
这里重要的一点是,在JavaScript中,函数是一流的对象。 要详细说明这一点,我还可以执行以下操作:
var log = function(i) {
console.log(i);
}
for(var i=0; i<3; i++){
log(i);
}
在此示例中,我将函数存储为变量,然后使用函数调用运算符()
对其进行了调用
回到原始示例,匿名函数周围的括号实际上包含了我存储在log变量中的内容。 然后,尾括号会调用在括号内创建的匿名函数。
(function(i){})(i)
这是一个自执行功能 。 这些将自动内联求值以返回值。 它是值得理解的Java的一个不错的功能。 您可以通过这种方式使用它们,但是它们对于创建范围和扩展代码的Javascript模块非常有用。
对于循环的每次迭代,您都会创建并立即调用匿名函数,无论该特定迭代时i
的值是多少。
请不要在不传递任何参数的情况下这样做会起作用,因为调用函数时i
仍处于上下文中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.