[英]Window object properties behavior
當我們有普通的 javascript 對象時,我們可以使用像objectName.proprtyName
這樣的語法來訪問那里的屬性。 如果我們只使用propertyName
,那么我們會得到如下錯誤 -
const myObj = { userIdName : "John" }; console.log(myObj.userIdName); //John console.log(userIdName); //error "Not defined"
但是,對於內置window
對象,我們可以單獨使用window.propertyName
和propertyName
,如下所示 -
console.log(window.alert); console.log(alert); //both return same result
window
對象的這種行為究竟是什么原因造成的? 我們可以為任何顯式構建的對象(如第一個片段中的對象)復制相同的行為嗎? (雖然沒有人想污染全局范圍,但我只有這個查詢)
編輯- 我收到評論說這個問題是另一個問題的重復。 這個問題與我的答案非常相似,只是有一個區別 - 我正在尋找一種方法來復制window
對象的相同全局可訪問行為。
window
對象的這種行為究竟是什么原因造成的?
JavaScript 有兩種主要類型的環境記錄(一種用於“保存”名稱 -> 值關聯的構造): 聲明性記錄和對象記錄。
聲明性環境記錄以特定於實現的方式存儲這些關聯。 這是最常見的環境記錄類型,例如在您調用函數時創建。
如名稱所示,對象環境記錄使用實際的 JavaScript 對象作為“后端”。 這意味着該環境中的每個條目都成為該“綁定對象”的屬性,反之亦然。
全局環境使用這樣的對象環境,並且該綁定對象可通過瀏覽器中的window
獲得。
我們可以為任何顯式構建的對象(如第一個片段中的對象)復制相同的行為嗎?
不推薦使用的with
語句可能仍然存在,並使用提供的對象作為綁定對象創建對象環境記錄。 從規范:
with
語句將計算對象的對象環境記錄添加到正在運行的執行上下文的詞法環境中。 然后它使用這個增強的詞法環境執行一個語句。 最后,它恢復了原來的詞法環境。
var obj = {foo: 42}; with (obj) { console.log(foo); }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.