簡體   English   中英

變量“名稱”不返回未定義

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

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