[英]Variable 'name' doesn't return undefined
我正在學習 JavaScript 中的吊裝。 當我嘗試這段代碼時
console.log('name', name)
console.log('age', age)
console.log('occupation', occupation)
var name = 'tom'
var age = '23'
var occupation = 'builder'
在我的 chrome 開發者工具中,我得到了
name tom
age undefined
occupation undefined
為什么名稱不是未定義的,但其他變量是?
編輯:
我的 html 文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script src = "index.js"></script>
</body>
</html>
我的 index.js 文件
console.log('name', name)
console.log('age', age)
console.log('occupation', occupation)
var name = 'tom'
var age = '23'
var occupation = 'builder'
我重新啟動了計算機,創建了新文件,但沒有任何改變。 在 firefox 我得到
name <empty string>
age undefined
occupation undefined
這完全按預期工作:“年齡”和“職業”的聲明( 但未分配值)被提升,因此您的控制台日志顯示它們存在值“未定義”(而不是拋出ReferenceError
),但name
很特別:你不是聲明它的人,即使你的代碼讓它看起來像你:
真正發生的事情是您編寫的代碼是作用域的,因此當您說var name = "tom"
時,您實際編寫的是currentscope.name = "tom"
。 In any kind of explicit scope (a function, a module, etc) this will behave the way you expected, but in global scope in a browser (or more precisely, "in any execution context in which your scope is window
"), what這意味着您的代碼實際上執行為window.name = "tom"
。
這就是 go 錯誤的地方: name
已經作為window
object 上的全局屬性存在
當然,這也適用於任何其他值,如果你var numbats = "cute";
在全局 scope 中,與window.numbats = "cute";
所以如果你不想遇到無聲的命名沖突:不要在全局 scope 中聲明東西。 在 function 中進行測試(其中var name
將隱藏全局name
),或者您可以使用現代 JS 並使用let
而不是花括號塊,但當然我們不再使用var
了。
鮮為人知的有趣事實:將全局name
設置為"tom"
,然后在同一個選項卡中瀏覽 web 一個小時,即使一個小時后, window.name
仍然是您的值,除非其他人更改了它,這幾乎永遠不會發生。 這是讓多方面跟蹤成為可能的有趣方式之一。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.