这两者之间有什么区别

what's the difference between those two?

本文关键字:区别 什么 两者之间      更新时间:2023-09-26
  var test = function(x) {
         return x + 2;
    };

我可以使用测试(3)

但是当我使用

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

我无法使用测试(3)

为什么?

第二个代码片段是 IIFE - 立即调用的函数表达式的示例。

第一组括号内的表达式的结果定义了一个接受一个参数(名为 x )的函数。第二组括号立即调用它,返回结果。由于在调用表达式时未传递任何参数,因此x undefined,因此它会undefined + 2计算表达式并返回 NaN

在第一种情况下,您正在定义一个函数,因此您可以执行test(3)

在第二种情况下,您正在执行一个函数,因此,结果可能会NaN

在第二个示例中,您正在利用 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;
    })();