通常我們說的定義一個變數會涉及到變數宣告和賦值兩個階段。首先什麼是變數宣告,其實就是提前給他分配一個儲存空間,並不一定要賦值,可以在需要的時候賦值使用。嚴格模式下,對於未宣告變數進行任何操作都會報錯,非嚴格模式下就不一定了,就像題主所說的那個問題。而變數賦值,就是定義一個合法的值給變數,如果此時變數沒有被宣告,那麼在嚴格模式下會報錯,因為沒有分配儲存空間,這個值放哪裡呢,只能報錯,但是在非嚴格模式下,不會報錯,因為瀏覽器頂層有一個window物件,當我們需要賦值操作時,這個未宣告的變數就會自動掛靠在window全域性物件上,然後分配記憶體儲存值。所以賦值會給未定義變量出現如下結果undefined1=1;undefined1; // 1window.undefined; // 1但是如果訪問一個未宣告的變數會報錯,因為他沒有變數自動掛靠在window全域性物件上從而分配記憶體。所以undefined2; //報錯算了算了,編不下去了,舉個例子:你是一個快遞小哥get過程就是上門取件,但是客戶沒有快遞要寄,所以你被拒絕了;set過程就是上門派件,可能不是客戶自己買的,但有可能是別人給他買的,所以他還是簽收了!非嚴格模式就是這樣子~
通常我們說的定義一個變數會涉及到變數宣告和賦值兩個階段。首先什麼是變數宣告,其實就是提前給他分配一個儲存空間,並不一定要賦值,可以在需要的時候賦值使用。嚴格模式下,對於未宣告變數進行任何操作都會報錯,非嚴格模式下就不一定了,就像題主所說的那個問題。而變數賦值,就是定義一個合法的值給變數,如果此時變數沒有被宣告,那麼在嚴格模式下會報錯,因為沒有分配儲存空間,這個值放哪裡呢,只能報錯,但是在非嚴格模式下,不會報錯,因為瀏覽器頂層有一個window物件,當我們需要賦值操作時,這個未宣告的變數就會自動掛靠在window全域性物件上,然後分配記憶體儲存值。所以賦值會給未定義變量出現如下結果undefined1=1;undefined1; // 1window.undefined; // 1但是如果訪問一個未宣告的變數會報錯,因為他沒有變數自動掛靠在window全域性物件上從而分配記憶體。所以undefined2; //報錯算了算了,編不下去了,舉個例子:你是一個快遞小哥get過程就是上門取件,但是客戶沒有快遞要寄,所以你被拒絕了;set過程就是上門派件,可能不是客戶自己買的,但有可能是別人給他買的,所以他還是簽收了!非嚴格模式就是這樣子~