使用下面的代码,customer.name 未定义。有人可以帮助我理解代码的原因和情况吗?
var customer = function () {
var name = "Contoso";
return {
getName: function () {
return name;
},
setName: function (newName) {
name = newName;
}
};
}();
alert (customer.name);
最佳答案
这几乎是a classic JS module pattern -an immediately-invoked function expression (IIFE)它返回一个对象,但也允许可变隐私。
我说几乎是因为模块模式通常看起来像这样。
var customer = (function () {
//
})();
下面的行将字符串范围限定为局部变量并将其应用于 name
。由于其范围的原因,无法在 IIFE 之外访问它。
var name = "Contoso";
因为该函数是立即调用的,所以它返回该对象并将其应用于客户
。一种方法返回 name
的值,另一种方法则更新它。
return {
getName: function () { return name; },
setName: function (newName) { name = newName; }
};
但是,由于 name
对于 IIFE(模块)来说是“私有(private)”的,因此 customer.name
返回 undefined
。
要获取名称,请使用返回对象 customer.getName()
上的方法。
要设置新名称,请使用其他方法customer.setName('Bob')
。
这两个方法都可以访问私有(private)变量name
due to a very important concept know as function closure由此,函数可以保留(“关闭”)其外部词法环境 - 在这种情况下很有用,以及诸如事件监听器之类的东西。
关于javascript - 在准备 70-480 Microsoft 考试时,我需要帮助理解为什么答案是正确的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36538013/