Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.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_Function_Closures - Fatal编程技术网

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

Javascript 这是一个立即调用的函数表达式吗?,javascript,function,closures,Javascript,Function,Closures,我是一个javascript新手,试图用这段代码来表达我的想法。 我找到了 我仍然很难理解它。因为它涉及一些我不熟悉的模式 // output 0-9, seperated by 1 sec delay. for (var i = 0; i < 10; i++) { setTimeout(function(x) { return function() { console.log(x); }; }(i), 100

我是一个javascript新手,试图用这段代码来表达我的想法。 我找到了

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

// 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);
}
我认为它是一个立即调用的函数表达式。 但这不是正确的语法吗

(function() {
  // some code
})();
是的,
(i)
是调用的参数列表。请看一看详细的解释。在这种情况下,分组括号是不必要的,因为它是
setTimeout
函数调用的参数,因此也是一个表达式


术语iLife不仅仅指此模式的语句形式,在您的立即调用函数示例中,.

parantises是可选的

(function() {
  // some code
})();
可以重写为

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

function(x) { // x = 1
    return function() { 
        console.log(x); // x = 1
    }; 
}(1)

那确实是一种生活。您引用的语法是0个参数的生命周期;你问的语法是一个由1个参数组成的生命周期。它将在内部代码中将
i
分配给
x
。比较:

var print0 = function() {
  console.log("Hello!");
};
print0();
(单独)等同于

(function() {
  console.log("Hello!");
})();
(function(name) {
  console.log("Hello, " + name);
})("George");
因此名称是:创建一个函数,然后立即调用它

但是,如果您想要一个参数,那么实际上什么都不会改变:

var print1 = function(name) {
  console.log("Hello, " + name);
};
print1("George");
(单独)等同于

(function() {
  console.log("Hello!");
})();
(function(name) {
  console.log("Hello, " + name);
})("George");
这里的括号确保函数定义将作为表达式而不是语句。还有其他方法可以确保这一点,一个常见的方法是

!function() {
  console.log("Hello!");
}();
(但是有理由更喜欢使用括号。)因为您使用它作为
setTimeout
调用的参数,所以它不可能是一个语句,所以不需要这些技巧。它仍然被称为“立即调用的函数表达式”,因为您仍然在构造函数表达式并立即调用它


这里使用IIFE的原因是“捕获”变量
i
的值,而不是
x
的位置。如果没有闭包技巧,您将获得10个超时,所有输出都是
10
(当
console.log
解析时,
x
表示的位置值)。

如果有人对此代码感兴趣,请给出另一种解释。