問題引發自我給name賦值之後無論怎麼刷新頁面這個值都不變,讓有有點懷疑js變數的生命週期了!也是偶然碰到的。上一段測試程式碼,一開始沒有定義name,也沒有賦值,但是typeof name 是 string。後來印出window對象,發現對像中有name這個屬性,而且是個空字串,那麼也好理解。但是為什麼賦值之後,這個值不是初始化為空字串而是一直存在呢?
name你賦值的時候,name='hello word';其實是window.name='hellow world';然後你在看一下window.name的定義是Gets/sets the name of the window. 我的理解時此時你給這個視窗設定了名稱,所以不管你怎麼刷新,視窗沒有關閉,名稱就在;這倒不是js變數的生命週期問題
name你賦值的時候,name='hello word';其實是window.name='hellow world';然後你在看一下window.name的定義是Gets/sets the name of the window.
我的理解時此時你給這個視窗設定了名稱,所以不管你怎麼刷新,視窗沒有關閉,名稱就在;這倒不是js變數的生命週期問題
問題就在於,如果你刷新了頁面,就是一個新的運行上下文件,所以東西都回到了初始狀態,你給他賦的值已經是上一個運行上下文的事情,怎麼會在新刷新出來的上下文中起作用?
哇,我也是第一次看到這樣的情況,如果放到onload裡面就不會出現這種情況,等大牛指導一波。
剛試了一下,確實會將值賦值到 window 物件裡面當作屬性,F5刷新的時候也不會被刷掉
下面是window 物件的介紹,裡面有一句:所有 JavaScript 全域物件、函數、變數都自動成為 window 物件的成員。
Window 物件
所有瀏覽器都支援 window 物件。它表示瀏覽器視窗。
所有 JavaScript 全域物件、函數、變數均自動成為 window 物件的成員。
全域變數是 window 物件的屬性。
全域函數是 window 物件的方法。
例如,如果我們定義一個全域變數 name1,也可以在 window 物件中找到。
window 對象,它表示瀏覽器視窗。 因此只要視窗不關掉,即使F5刷新,裡面的值(需要時winow 物件本身就有的屬性)就會一直存在。
突然想到一點,還可以利用 window.name 來實現跨域資料傳輸。
猜測可能跟js的自動轉換型別跟
typeof
坑有關係,因為把程式碼換成:log輸出的照樣是
string
,所以能排除掉是神賦值的問題。剛才順手查了一下 MDN,發現
window
本身有个name
屬性(傳送門)…MDN上給的資訊不多,於是又去參考了下阮老師《JavaScript 標準參考教學》上的相關說明:在name變數還沒定義的時候,直接存取的是頂層的
window.name
,這就是個字串……大概其就是這個意思吧?