![](/img/trans.png)
[英]Why does referencing undeclared variables throw a reference exception but referencing undeclared properties doesn't?
[英]Undeclared variables in an ..if statement doesn't throw an error
我剛剛注意到Javascript中有一些奇怪的行為。 為了編寫短代碼,我提出了以下功能:
if(a = 'A|B|C'.split('|'), a.length > 1){
// I have access to a, but it was never declared as a variable?
} else {
// some code
}
// I still have access to 'a' over here?
我希望代碼會引發一些有關未聲明a
錯誤,但顯然,它為它分配了'A|B|C'.split('|')
,並使用逗號將a
用作a正常聲明的變量。
此外,該變量存在於if
語句之外,我可以在下面的代碼中訪問它。
另一件事,顯式設置變量:
if(let a = 'A|B|C'.split('|'), a.length > 1)
引發錯誤。 這與for, for ..in
循環不同,后者需要在使用變量之前聲明變量。
有人可以解釋這是如何有效的嗎?
其實a
被聲明為一個全局變量,當你只是值分配給它。 它將被系統聲明為全局window
對象的一部分。
如果看一下MDN var
參考,您會看到:
在執行賦值時,將值分配給未聲明的變量會隱式地將其創建為全局變量(它成為全局對象的屬性)。
這就是為什么您共享的代碼可以完美運行,並且不會引發任何錯誤的原因。
通常,JS不會對未聲明的變量拋出錯誤,但會為其分配值。
在執行賦值時,將值分配給未聲明的變量會隱式地將其創建為全局變量(它成為全局對象的屬性)。
如果您想得到這類錯誤,請使用"use strict";
以嚴格模式添加腳本"use strict";
函數頂部的一行。
“使用嚴格”; 定義JavaScript代碼應在“嚴格模式”下執行。 在嚴格模式下,例如,您不能使用未聲明的變量。
這是您提供的代碼,不會引發錯誤:
if(a = 'A|B|C'.split('|'), a.length > 1){ // I have access to a, but it was never declared as a variable? } else { // some code } console.log(a);
這是我僅在頂部添加strict指令的代碼,它開始引發錯誤。
"use strict"; if(a = 'A|B|C'.split('|'), a.length > 1){ // I have access to a, but it was never declared as a variable? } else { // some code }
這里發生了很多事情。 將嘗試解釋每個。
首先,在下面的行中,您有多個用逗號分隔的表達式。 在JS中,每個表達式都從左到右求值,並返回最后一個表達式。 所以基本上這將如下工作
if(a = 'A|B|C'.split('|'), a.length > 1){ // evaluate 'A|B|C'.split('|') and assign the value to a variable 'a' if it exists. Otherwise create a new global variable 'a' and assign the value.
將轉換為
if(a,a.length > 1) // a gets assigned a value which
// here is an array consisting of 3 elements.["A","B","C"].
將轉換為
if(["A","B","C"], ["A","B","C"].length > 1)
將轉換為
if(true) // comma separated expression always
// returns the last expression's value which here would be true since a.length is 3
因此,您將始終運行if塊代碼。
您提到的第二個問題是因為您無法在if語句內部和語句中編寫語句。 並且使用var / let基本上是一個聲明。 請記住,如果條件允許,您可以在內部編寫表達式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.