首頁  >  文章  >  web前端  >  JavaScript中的變數查找

JavaScript中的變數查找

PHPz
PHPz原創
2017-04-04 10:30:142047瀏覽

總所周知,JavaScript變數是按照作用域鏈來進行查找的(作用域和作用域鏈相關知識可參考我的另一篇文章,《基於JavaScript作用域鏈的效能調優》), 那麼,對於一個簡單的賦值運算,等號左右兩邊變數的找出方式一樣嗎?讓我們從一個簡單例子講起~

console.log(a);   // undefined
var a = 3;
console.log(a);   // 3

console.log(b);  // ReferenceError
b = 4;
console.log(b);  //4

1. LHS(left-hand-side左查找)和RHS(right-hand-side右查找)

概念如下:

  • LHS查詢:試圖找到變數容器本身,因此可以對其進行賦值

  • RHS查詢:找出某個變數的值

對於一個賦值語句var a = b;,等號左邊進行LHS查詢,等號右側進行RHS查詢;如果是一個普通的列印語句console.log(a),那麼,找出變數a屬於RHS查詢。

兩者的相同之處:都遵循作用域鏈查找

2. LHS和RHS查詢區別

(1) LHS查詢#​​##當JavaScript引擎執行LHS查詢時,如果在頂層作用域中無法找到目標變量,那麼,就會在全域作用域中建立一個具有該名稱的變量,並將其傳回給引擎(
非嚴格模式下)。

要注意,這種方式創建的全域變量,嚴格上來講並不是真正的變量,而是全域

物件屬性,可以透過 delete<a href="http://www.php.cn/wiki/1298.html" target="_blank"></a>運算子將其刪除。但是,用var宣告的全域變量,是不可以用delete運算子刪除的。

參考文章首部的例子:

b = 4;
console.log(b);  // 4
delete b;
console.log(window.b); // undefined
程式中並沒有宣告變數

b,但是由於LHS查詢會自動建立未找到的目標變量,所以,列印b返回4。然後刪除b,可刪除成功。

如果是嚴格模式:

"use strict";
b = 4;
console.log(b);
這時LHS查詢將無法自動建立未宣告的目標變量,所以,列印

b拋出例外Uncaught ReferenceError: b is not defined

(2) RHS查詢#​​##當JavaScript引擎執行RHS查詢時,如果在作用域鏈中都無法找到目標變量,那麼,引擎會拋出ReferenceError異常。


參考文章首部的例子:

console.log(b);  
b = 4;

RHS查詢變數

b

,在全域作用域中未曾找到該變數定義,於是,引擎拋出例外Uncaught ReferenceError: b is not defined3. 小貼士

(1) 變數提升

概念:用var宣告的變量,總是會被JavaScript解釋器悄悄地「提升」到方法體的最頂端。


參考文字的範例:

console.log(a); 
var a = 3;

JavaScript引擎會將其解析為:

var a = undefined;
console.log(a); 
a = 3;

所以,第一次列印

a

時會回傳undefined(2) ReferenceError和TypeError

ReferenceError代表作用域判別失敗,也就是作用域內查詢變數失敗。

TypeError代表作用域判別成功,但是對結果的操作是非法或不合理的。

例如:

foo();
var foo = function () {
     console.log('a');
}

執行

foo()

語句時,首先RHS查找,在全域作用域中找到foo變量,值為undefined(變數提升)。 然後以函數
執行方式操作foo變量,很明顯,undefined並不是一個合法函數,於是引擎拋出異常:Uncaught TypeError: foo is not a function,執行失敗。

以上是JavaScript中的變數查找的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn