簡體   English   中英

..if語句中未聲明的變量不會引發錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM