簡體   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