![](/img/trans.png)
[英]How to execute deno without strict mode ? Error: Uncaught SyntaxError: Identifier 'list' has already been declared
[英]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
語句旁邊的表達式。 在這里,這是一個對象文字,具有兩個屬性v
和f
。
在您的原始代碼中, "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...
, 100
和undefined
。
最后,您有兩個都引發錯誤的語句:
console.log(iObj.v);
iObj.f();
由於iObj
是未定義的並且沒有屬性可言,因此它們都會引發錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.