var test = function(x) {
return x + 2;
};
我可以使用test(3)
但是当我使用
时 var test = (function(x) {
return x + 2;
})();
我不能使用test(3)
为什么?
答案 0 :(得分:0)
第二个代码段是IIFE的示例 - Immediately-Invoked Function Expression。
第一组parens中表达式的结果定义了一个带有一个参数(名为x
)的函数。第二组parens立即调用它,返回结果。由于您在调用时未传递任何参数,x
为undefined
因此它会评估表达式undefined + 2
并返回NaN
。
答案 1 :(得分:0)
在第一种情况下,您正在定义一个函数,因此您可以执行test(3)
在第二种情况下,您是executing一个函数,因此,您可能会得到NaN
作为结果。
答案 2 :(得分:0)
在第二个示例中,您正在利用JavaScript闭包。闭包允许您控制作用域和命名空间,并声明私有方法和变量。
请考虑以下事项:
var test = (function() {
var privateVar1;
var privateVar2;
function privateFunction() {
}
return {
publicFunction1: function() {
},
publicFunction2: function() {
}
};
})();
test
现在等于以下内容:
{ publicFunction1: function() {}, publicFunction2: function() {} }
声明后立即调用该函数,此时x
没有值。在函数声明之前(在其范围之外)初始化x
以修复您遇到的问题:
var x = 10;
var test = (function(x) {
return x + 2;
})();