簡體   English   中英

將聲明window.variable函數使值變為全局?

[英]will declaring window.variable in a function make the value global?

好吧,那么讓我說我有一個全局變量myVar ,並且在一個函數myFunction() ,我寫了myVar = 2; 通常,這將使myVar在函數等於2 我的問題是,在函數中聲明window.myVar = 2將使myVar等於2 全局 (因此,函數外的alert(myVar)返回2 )?

首先快速回顧一下全局變量:

使用varlet聲明的全局變量的行為方式不同。 使用var定義的全局變量使用無法刪除的變量名稱創建全局對象的不可配置屬性。

 var x = "var x"; console.log("window.x: " + window.x); console.log( JSON.stringify(Object.getOwnPropertyDescriptor(window, "x"))) 

但是使用let聲明的全局變量不會成為全局對象的屬性。 如果你有一個window屬性(在瀏覽器中)和一個同名的let變量,你必須用window.限定window屬性window. 訪問它:

 let y = "let y"; window.y = "window.y"; console.log("y = " + y + "( using the identifier only)"); console.log("window.y = " + window.y); 

現在回到這個問題,

  1. 如果在全局范圍內聲明myVar並在函數內引用它,則將訪問全局變量, 前提是您尚未在函數或任何外部嵌套函數中重新聲明該變量。 如果沒有重新編譯,這種訪問既可用於讀取也可用於寫入,並且在函數內執行myVar = 2將更新全局變量的值。

  2. 在函數內執行window.myVar = 2只會更新全局myVar變量的值(如果使用var聲明它)。 它可能會創建一個窗口屬性,但不會更新全局let變量的值。

因此調用函數后在警報中顯示的myVar值取決於

  • 是否通過在函數范圍內重新聲明變量(在函數本地或外部函數中)來掩蓋全局聲明,
  • 是否使用unadorned標識符或作為命名窗口屬性引用myVar ,結合使用
  • myVar最初是使用var還是let聲明的。

暫無
暫無

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

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