/* 總結: this 的指向: 1.this 的指向 是在執行上下文時才肯定的, 而且肯定後不可更改; 2.this 指向 「其執行上下文的環境對象」; 「其執行上下文的環境對象」 判讀依據以下: */
/* 瀏覽器環境下: 嚴格模式下: 1.全局上下文中的 this 「其執行上下文的環境對象」爲,全局執行上下文的環境對象,而全局執行上下文的環境對象 爲 Window對象; 2.函數上下文中的 this 情景一:apply、call、bind 指定環境對象 「其執行上下文的環境對象」爲,被指定的環境對象,不管是什麼,即便是 null 或者 undefined; 情景二:沒有指定環境對象 ->1.做爲 獨立函數 執行 「其執行上下文的環境對象」爲 undefined; ->2.做爲 對象方法 執行 「其執行上下文的環境對象」爲 這個擁有它的對象; 3.對象屬性中的 this 「其執行上下文的環境對象」爲,全局執行上下文的環境對象 爲 Window對象; 4.構造函數 和 原型方法中的 this 構造函數中: 「其執行上下文的環境對象」爲,以構造函數名命名的新對象; 原型方法中: 「其執行上下文的環境對象」爲,構造函數的原型對象; 非嚴格模式下: 1.全局上下文中的 this (同 嚴格模式) 2.函數上下文中的 this 情景一:apply、call、bind 指定環境對象 (同 嚴格模式) 情景二:沒有指定環境對象 ->1.做爲 獨立函數 執行 「其執行上下文的環境對象」爲 Window對象; ->2.做爲 對象方法 執行 (同 嚴格模式) 3.對象屬性中的 this (同 嚴格模式) 4.構造函數 和 原型方法中的 this 構造函數中: (同 嚴格模式) 原型方法中: (同 嚴格模式) */
/* Node環境下: 嚴格模式下: 1.全局上下文中的 this 「其執行上下文的環境對象」爲,全局執行上下文的環境對象 當前模塊{},因此全局中 this 指向當前模塊對象{}; 2.函數上下文中的 this 情景一:apply、call、bind 指定環境對象 「其執行上下文的環境對象」爲,被指定的環境對象,不管是什麼,即便是 null 或者 undefined; 情景二:沒有指定環境對象 ->1.做爲 獨立函數 執行 「其執行上下文的環境對象」爲 undefined; ->2.做爲 對象方法 執行 「其執行上下文的環境對象」爲 這個擁有它的對象; 3.對象屬性中的 this 「其執行上下文的環境對象」爲,全局執行上下文的環境對象 當前模塊{},因此全局中 this 指向當前模塊對象{}; 4.構造函數 和 原型方法中的 this 構造函數中: 「其執行上下文的環境對象」爲,以構造函數名命名的新對象; 原型方法中: 「其執行上下文的環境對象」爲,構造函數的原型對象; 非嚴格模式下: 1.全局上下文中的 this (同 嚴格模式) 2.函數上下文中的 this 情景一:apply、call、bind 指定環境對象 (同 嚴格模式) 情景二:沒有指定環境對象 ->1.做爲 獨立函數 執行 「其執行上下文的環境對象」爲 global對象; ->2.做爲 對象方法 執行 (同 嚴格模式) 3.對象屬性中的 this (同 嚴格模式) 4.構造函數 和 原型方法中的 this 構造函數中: (同 嚴格模式) 原型方法中: (同 嚴格模式) */
/* 能夠看出,瀏覽器環境 和 Node環境中主要的不一樣就是,全局執行上下文的環境對象: 瀏覽器中:全局執行上下文的環境對象 爲 Window對象,在 非嚴格模式下,若是沒有指定環境對象 或 環境對象爲 null 或 undefined, this指向會轉爲 Window對象; Node中:全局執行上下文的環境對象 爲 當前模塊對象{},在 非嚴格模式下,若是沒有指定環境對象 或 環境對象爲 null 或 undefined, this指向會轉爲 global對象; */
原創:轉載註明出處,謝謝 :)瀏覽器