繁体   English   中英

当“使用严格”时如何引用对象的实例; 已经申报了吗?

[英]How to Reference an instance of an object when “use strict”; has been declared?

我创建了一个对象并实例化了它。

当我要访问其成员(属性,属性...)时,会发出错误消息。

如何解决问题?

请参见代码中的错误作为注释。

 <script type="text/javascript">
  "use strict";
  var v = 25;

  var dObj = function(){
      var v = 100;
      var f=(function(){
           console.log("Insiding...")
      })();
      console.log(v); // v locale
      console.log(window.v); // v globale.
  }

  var iObj = dObj();

 // THE ERROR LAYS HERE //
 // Uncaught TypeError: Cannot read property 'v'
 // of undefined at this.html:19 [YANDEX]
  console.log(iObj.v);

 // And Here too. TypeError:
 // iObj is undefined this.html:22:1 [FIREFOX]
 iObj.f();
 </script>

Javascript中的var关键字声明了一个变量; 它不声明或分配任何对象的属性。 看起来您想要编写以下内容:

var dObj = function () {
  return {
    v: 100,
    f: function(){
      console.log("Insiding...")
    },
  };
};

当您调用一个函数(例如dObj() ,函数调用的值就是该函数的“返回值”,即函数内第一个return语句旁边的表达式。 在这里,这是一个对象文字,具有两个属性vf


在您的原始代码中, "use strict"; 启用严格模式,这实际上不是错误的原因。 然后var v = 25; 声明变量v ,实际上从未使用过。 然后,您具有dObj的以下定义:

var dObj = function(){
  var v = 100;
  var f=(function(){
       console.log("Insiding...")
  })();
  console.log(v); // v locale
  console.log(window.v); // v globale.
}

这将声明一个函数dObj ,该函数被调用时将执行以下操作。 它创建一个局部变量v (隐藏先前创建的v )并将其值设置为100。

然后,它创建另一个局部变量f并将其设置为等于IIFE(“立即调用的函数表达式”)的返回值(function() { console.log("Insiding...")})() - undefined 该IIFE还向控制台输出“ Insiding ...”。 换句话说,该代码不会使f功能。 取而代之的是,它评估一个匿名函数(此处输出“ Insiding ...”)并使其返回值为f (此处为undefined )。

然后输出局部变量v ,输出100。

最后,它输出undefined window.v (如果您之前编写了window.v = 25 ,则将为window对象分配一个新属性,因此它将输出25而不是undefined 。也确实是window是浏览器中的全局对象,因此如果您没有编写"use strict"并且没有编写var"use strict" v = 25 ,则可以达到与window.v = 25相同的效果,但是这样做很麻烦,因此使用“ use strict”是正确的。)

var iObj = dObj();

iObj设置为dObj函数的返回值,该值undefined因为没有return语句。 但是, dObj确实运行完毕:即输出Insiding...100undefined

最后,您有两个都引发错误的语句:

console.log(iObj.v);
iObj.f();

由于iObj是未定义的并且没有属性可言,因此它们都会引发错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM