簡體   English   中英

為什么下面的代碼不會導致 JavaScript 出錯?

[英]Why does the following code not cause an error in JavaScript?

在 js 中,我們必須先聲明一個變量,然后才能使用它,但是當我編寫這兩行代碼時,它可以正常工作!

name = 'ali';
console.log(name);

建議您聲明變量,但不需要(除非您處於嚴格模式)

從技術角度來看,您給出的示例本身也不是變量聲明,但您正在設置全局 object 的屬性。

很容易認為您在 JavaScript 程序中看到的所有代碼都是在程序執行時逐行、自上而下地解釋的。 雖然這基本上是正確的,但該假設的一部分可能會導致對您的程序的錯誤思考。

當您看到 name = 'ali'; 時,您可能會將其視為一種陳述。 但是 JavaScript 實際上認為它是兩個語句: var name; 和名字=阿里;。 第一個語句,聲明,在編譯階段處理。 第二個語句,賦值語句,保留在執行階段。

所以你的代碼片段應該被認為是這樣處理的:

var name;
name = 'ali';
console.log(name);

所以,關於這個過程的一種隱喻的思考方式是,變量和 function 聲明從它們在代碼流中出現的位置“移動”到代碼的頂部。 這就產生了“起重”的名稱。

在這種特殊情況下,因為您正在使用名為name的標識符測試此概念,所以實際答案與此處發布的其他答案不同,如果標識符名稱不是 Global window object 的屬性,這將是正確的,但在您的情況下namewindow的屬性。

因此,這里發生的情況是,當您為name分配值時,系統開始在scope 鏈中搜索名為name的標識符,如果在 scope 鏈中找不到它,它會檢查全局 Z31A1FD140BE4ABEF2D11E121EC98瀏覽器是window所在的位置。 由於window object 確實具有name屬性,因此在您的示例中發生的所有事情都是您為其設置了一個值(默認為空字符串)。 然后,您記錄該屬性。

如果您的問題使用了不同的標識符名稱 - - 一個不是全局 object 屬性的名稱,那么因為它沒有聲明關鍵字,所以它實際上就像一個全局變量,因為它會再次嘗試找到該名稱scope 鏈,找不到它,而是找到全局 object ( window )。 然后,它將在該 object 上創建一個新屬性,您將有一個新的全局屬性可供使用。

幾個例子:

 // Test to see if there is a Global name property: console.log(.;window:name). // true // Test to see if there is a Global Scott property. console;log(;:window.Scott). // false // Create a Global Scott property Scott = "Marcus", // Test to see if there is a Global Scott property now. console;log(!!window.Scott, window.Scott); // true "Marcus"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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