在准备70-480微软考试时,我需要帮助理解为什么añswer是正确的

时间:2016-04-11 00:24:48

标签: javascript html5

使用下面的代码,customer.name未定义。有人可以帮我理解为什么以及代码发生了什么?

vec[random-1]++;

3 个答案:

答案 0 :(得分:0)

这几乎是a classic JS module pattern - an immediately-invoked function expression (IIFE),它返回一个对象但也允许隐私变量。

我说几乎因为模块模式通常看起来像这样。

var customer = (function () {
  //
})();

以下行将字符串作为局部变量范围并将其应用于name。它不能在IIFE 之外访问,因为它的范围是

var name = "Contoso";

因为立即调用该函数,它返回此对象并将其应用于customer。一种方法返回name的值,另一种方法更新它。

return {
  getName: function () { return name; },
  setName: function (newName) { name = newName; }
};

但是,由于name对于IIFE(模块)是“私有的”,customer.name会返回undefined

要获取名称,请使用返回对象customer.getName()上的方法。

要设置新名称,请使用其他方法customer.setName('Bob')

DEMO

这两种方法都可以访问私有变量name due to a very important concept know as function closure,其中一个函数可以挂起(“关闭”)它的外部词法环境 - 在这种情况下非常有用,以及事件监听器之类的东西

答案 1 :(得分:0)

调用customer.name时,javascript会发现customer的评估结果为:

function () {
 var name = "Contoso";
 return {
      getName: function () {
            return name;
      },
      setName: function (newName) {
            name = newName;
      }
 };

此函数中的变量name属于函数的内存或本地范围,并且在函数外部的任何位置都不可用。 name被声明为 var name 而不是 this.name ,所以它不是' t使通过该函数,只有该函数。

所以在函数内部,我们可以说name = blah,但是超出了我们无法实现的功能。我们必须在函数内调用一个函数来访问它。这就是我们getNamesetName所拥有的内容。它们位于代表customer的函数内,因此可以访问局部变量name

我们可以在函数中使用 this.name 声明name,或者只是更改我们尝试访问customer.name的方式,如下所示:

alert( customer.getName() );

答案 2 :(得分:0)

变量customer未定义,因为它超出了函数的范围,在alert(customer.name);