这是一个立即调用的函数表达式吗?

时间:2015-07-22 04:15:11

标签: javascript function closures

我是一个javascript新手试图围绕这段代码。 我在这里得到http://brackets.clementng.me/post/24150213014/example-of-a-javascript-closure-settimeout-inside

我仍然很难理解它。因为它涉及一些我不熟悉的模式。

// output 0-9, seperated by 1 sec delay.
for (var i = 0; i < 10; i++) {
    setTimeout(function(x) { 
        return function() { 
            console.log(x); 
        }; 
    }(i), 1000*i);
}

这段代码中(i)的含义是什么?

function(x) { 
    return function() { 
        console.log(x); 
    }; 
}(i)

我认为这是一个立即调用的函数表达式。 但这不是正确的语法:

(function() {
  // some code
})();

3 个答案:

答案 0 :(得分:2)

实际上,这是一个IIFE。你引用的语法是一个IFE为0的参数;你问的语法是1个参数的IIFE。它会在内部代码中将i分配给x。比较:

var print0 = function() {
  console.log("Hello!");
};
print0();

(孤立地)等同于

(function() {
  console.log("Hello!");
})();

因此名称:你创建一个函数,然后立即调用它。

但是,如果你想要一个参数,没有什么真正改变:

var print1 = function(name) {
  console.log("Hello, " + name);
};
print1("George");

(孤立地)等同于

(function(name) {
  console.log("Hello, " + name);
})("George");

这里的括号确保函数定义将被视为表达式而不是语句。还有其他方法可以确保这是一个常见的方法

!function() {
  console.log("Hello!");
}();

(但是有理由更喜欢括号。)因为你使用它作为setTimeout调用的参数,所以它可能不是一个声明,所以这些黑客不是必需的。它仍然被调用&#34;立即调用函数表达式&#34;,因为你仍在构造一个函数表达式并立即调用它。

这里使用IIFE的原因是为了捕捉&#34;变量i的值,而不是x的位置。如果没有关闭技巧,您将获得10次超时,所有输出10(当x结算时,console.log表示的位置值)。

答案 1 :(得分:0)

是的,D:\MyApp>ionic start diary1 tabs Creating Ionic app in folder D:\MyApp\diary1 based on tabs project Downloading: https://github.com/driftyco/ionic-app-base/archive/master.zip Error Initializing app: Error: connect ECONNREFUSED at exports._errnoException (util.js:746:11) at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1010:19) Error: connect ECONNREFUSED at exports._errnoException (util.js:746:11) at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1010:19) connect ECONNREFUSED (CLI v1.6.1) Your system information: Cordova CLI: 5.1.1 Ionic CLI Version: 1.6.1 Ionic App Lib Version: 0.3.3 OS: Windows 7 SP1 Node Version: v0.12.7 是呼叫的参数列表。请查看here以获取详细说明。在这种情况下,分组括号是不必要的,因为它是(i)函数调用的参数,因此无论如何都是表达式。

IIFE一词不仅指这种模式的陈述形式,parenthesis would be necessary

答案 2 :(得分:0)

在您立即调用的函数示例中,parantheses是可选的。

foreach($xml->Rate as $rate) {
    if($rate->@attributes['Symbol'] == 'EURUSD') {
        $query = "INSERT INTO tblrate (time, bid) VALUES (NOW(), :bid)";
        $query = $pdo->prepare($query);
        $query->execute(array(
            ':bid'    => $rate->Bid;
        ));
    }
}

可以重写为

(function() {
  // some code
})();

因此,示例函数调用中的function() { // some code }(); 变为函数定义中的i

x