this
this 指向並不是在函數定義的時候確定的,而是在調用的時候確定的。換句話說,函數的調用方式(直接調用、方法調用、new調用、bind、call、apply、箭頭函數)決定了 this 指向。
直接調用
函數內部的 this 指向全局對象,在瀏覽器中全局對象是 window,在 NodeJs 中全局對象是 global。直接調用並不是指在全局作用域下進行調用,在任何作用域下,直接通過 函數名(...) 來對函數進行調用的方式,都稱為直接調用。
方法調用
函數中的 this 指向調用該方法的對象。通過對象來調用其方法函數,它是 對象.方法函數(...) 這樣的調用形式。
new調用
在 es5 中,用 new 調用一個構造函數,會創建一個新對象,而其中的 this 就指向這個新對象。
箭頭函數
箭頭函數沒有自己的 this 綁定,箭頭函數中使用的 this,其實是直接包含它的那個函數或函數表達式中的 this。
Ps:非函數被調用時(這里分別打印40和10)
當obj在全局聲明時,無論obj.c在什么地方調用,這里的this都指向全局對象,而當obj在函數環境中聲明時,這個this指向undefined,在非嚴格模式下,會自動轉向全局對象。