Javascript 在准备70-480微软考试时,我需要帮助理解为什么añ;斯韦尔是对的
对于下面的代码,customer.name是未定义的。有人能帮我理解为什么以及代码是怎么回事吗Javascript 在准备70-480微软考试时,我需要帮助理解为什么añ;斯韦尔是对的,javascript,html,Javascript,Html,对于下面的代码,customer.name是未定义的。有人能帮我理解为什么以及代码是怎么回事吗 var customer = function () { var name = "Contoso"; return { getName: function () { return name; }, setName: function (newName) {
var customer = function () {
var name = "Contoso";
return {
getName: function () {
return name;
},
setName: function (newName) {
name = newName;
}
};
}();
alert (customer.name);
这几乎是-返回一个对象,但也允许可变隐私
我这么说几乎是因为模块模式通常是这样的
var customer = (function () {
//
})();
下一行将字符串作为局部变量定义范围,并将其应用于name
。由于其范围,无法在IIFE之外访问它
var name = "Contoso";
因为函数会立即被调用,所以它会返回此对象并将其应用于客户
。一个方法返回name
的值,另一个方法更新它
return {
getName: function () { return name; },
setName: function (newName) { name = newName; }
};
但是,由于name
对IIFE(模块)是“私有的”,因此customer.name
返回未定义的
要获取名称,请对返回的对象customer.getName()
使用方法
要设置新名称,请使用另一种方法customer.setName('Bob')
这两种方法都可以访问私有变量name
,通过该变量,函数可以保留(“关闭”)其外部词法环境(在这种情况下很有用)以及事件侦听器等内容。调用customer.name
时,javascript发现customer
的计算结果如下:
function () {
var name = "Contoso";
return {
getName: function () {
return name;
},
setName: function (newName) {
name = newName;
}
};
此函数中的变量name
,属于函数的内存或本地范围,在函数之外的任何地方都不可用name
被声明为var name而不是this.name,因此它不能通过函数使用,只能对函数使用
因此,在函数内部,我们可以说name=blah
,但在函数外部,我们不能。我们必须调用函数中的函数才能访问它。这就是我们的getName
和setName
的目的。它们位于表示客户
的函数中,因此可以访问局部变量名称
我们可以在函数中使用this.name声明name
,也可以更改尝试访问customer.name的方式,如下所示:
alert( customer.getName() );
变量customer未定义,因为它不在函数范围内,在第行alert(customer.name)处代码>