Javascript 这是一个立即调用的函数表达式吗?
我是一个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
// 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
表示的位置值)。如果有人对此代码感兴趣,请给出另一种解释。