【问题标题】:What is the purpose of these 2 different javascript declarations?这 2 个不同的 javascript 声明的目的是什么?
【发布时间】:2011-02-18 16:08:26
【问题描述】:

我想我已经弄清楚了,但我希望清楚地解释这一点——这两个 javascript sn-ps 之间究竟有什么区别?

;Person1 = (function() {
  var FirstName = 'Hello';
  var LastName = 'World';
  this.sayHello = function() {
    alert(FirstName + ' ' + LastName);
  };
});

;Person2 = (function() {
  var FirstName = 'Hello';
  var LastName = 'World';
  this.sayHello = function() {
    alert(FirstName + ' ' + LastName);
  };
})();

用 () 执行一个;最后,另一个不是。当我执行 new Person1().sayHello() 或 new Person2().sayHello(); 时,它们都按预期执行; ——是他们留下的吗?据我了解,后者是一个在浏览器读取时执行的闭包,但我还没有完全理解它的含义。感谢您的帮助!

更新:我错误地在 Person2 闭包中遗漏了 return 关键字。但是,我没有解决这个问题,因为答案对于描述这样做的含义非常有帮助:)

【问题讨论】:

    标签: javascript closures


    【解决方案1】:

    自调用函数背后的主要动机是避免污染全局命名空间。您可能有兴趣查看以下资源以供进一步阅读:

    【讨论】:

    • 谢谢先生。对我想知道的内容的简洁回答:一切都与范围有关。
    【解决方案2】:

    Person1 是一种相当标准的对象构造函数类型,可以用new 调用。 new Person1() 创建一个新对象,并在该对象上创建一个 sayHello 方法。

    Person2 正在立即执行,这会导致一些问题!在评估Person2 时,将调用该函数(在全局上下文中)。在该函数的执行中,this 将是 window 对象。执行的函数没有返回任何东西,所以 Person2 最终是未定义的:

    >>> Person2 = (function() { var FirstName = 'Hello' // ...}; })(); 
    >>> console.log(window.sayHello, Person2);
    function() undefined
    

    new Person2() 对我来说导致TypeError“Person2 不是构造函数”。如果你稍微改变一下,你可以让 Person2 闭包返回一个带有你的函数的对象:

    ;Person2 = (function() {
      var FirstName = 'Hello';
      var LastName = 'World';
      return {
        sayHello: function() {
          alert(FirstName + ' ' + LastName);
        }
      };
    })();
    
    Person2.sayHello();
    

    或者让它返回一个函数(这样你就可以new Person2()):

    ;Person2 = (function() {
      var FirstName = 'Hello';
      var LastName = 'World';
      return function() {
        this.sayHello = function() {
          alert(FirstName + ' ' + LastName);
        };
      };
    })();
    

    【讨论】:

    • 非常感谢您的深思熟虑的解释——我在创建 Person2 闭包时错误地忽略了返回。不过,我很高兴我这样做了,因为您的回复让我想起了 global 这样做的含义。
    【解决方案3】:

    第一个定义了一个内联函数,Person1 持有对它的引用。

    第二个等于没有采取任何行动。您正在定义一个内联函数并立即执行它。由于该函数不返回任何内容,Person2 未定义。

    这两个例子的行为都不像你描述的那样,所以也许你在输入你的例子时出错了?

    【讨论】:

    • Person2 可能未定义,但它也设置了this.sayHello,这将在window 对象上创建sayHello
    • 我的错 - 你是对的,我的人有一个错字3。我现在已经编辑过了。谢谢。
    猜你喜欢
    • 2012-07-13
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 2012-11-17
    • 2011-05-01
    • 2014-09-20
    相关资源
    最近更新 更多