使用下面的代码,customer.name未定义。有人可以帮我理解为什么以及代码发生了什么?
vec[random-1]++;
答案 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')
。
这两种方法都可以访问私有变量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
,但是超出了我们无法实现的功能。我们必须在函数内调用一个函数来访问它。这就是我们getName
和setName
所拥有的内容。它们位于代表customer
的函数内,因此可以访问局部变量name
。
我们可以在函数中使用 this.name 声明name
,或者只是更改我们尝试访问customer.name的方式,如下所示:
alert( customer.getName() );
答案 2 :(得分:0)
变量customer未定义,因为它超出了函数的范围,在alert(customer.name);
行