繁体   English   中英

javascript奇怪的行为需要解释

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM