这两者之间的区别是什么?

时间:2015-01-23 15:12:08

标签: javascript node.js

  var test = function(x) {
         return x + 2;
    };

我可以使用test(3)

但是当我使用

  var test = (function(x) {
         return x + 2;
    })();

我不能使用test(3)

为什么?

3 个答案:

答案 0 :(得分:0)

第二个代码段是IIFE的示例 - Immediately-Invoked Function Expression

第一组parens中表达式的结果定义了一个带有一个参数(名为x)的函数。第二组parens立即调用它,返回结果。由于您在调用时未传递任何参数,xundefined因此它会评估表达式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;
    })();