Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在准备70-480微软考试时,我需要帮助理解为什么añ;斯韦尔是对的_Javascript_Html - Fatal编程技术网

Javascript 在准备70-480微软考试时,我需要帮助理解为什么añ;斯韦尔是对的

Javascript 在准备70-480微软考试时,我需要帮助理解为什么añ;斯韦尔是对的,javascript,html,Javascript,Html,对于下面的代码,customer.name是未定义的。有人能帮我理解为什么以及代码是怎么回事吗 var customer = function () { var name = "Contoso"; return { getName: function () { return name; }, setName: function (newName) {

对于下面的代码,customer.name是未定义的。有人能帮我理解为什么以及代码是怎么回事吗

    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)处