前言
很多初學者會對 javascript 中的 this 的指向感到迷惑,?其實只要理解了 javascript 中函數的調用方式, 就不難理解 this 了
原生調用是最基本的函數調用方式
在 javascript 中, 函數一共有四種調用方式:
- 簡單調用
- 對象成員函數調用
- new 調用
- 所有的函數調用都能夠寫成以下形式, 我們稱之為原生調用, 也是第四種調用方法
fn.call(this, args...) // 或者, fn.apply(this, argsArray)
-
- fn 代表被調用的函數,
- call 是 javascript 語言自帶的 Function 類的原生方法,
- this 為調用 fn 的環境
- args 為電泳 fn 時傳入的參數
接下來, 試著把前三種函數的調用方式改寫成原生調用, 順便探討每種調用方式中, this的指向
簡單的函數調用
// 在全局換進中定義 fn
function fn(arg){console.log(this) // 使用了this//... }fn(arg)// 寫成原生調用
// fn.call(window, arg) // 此時 this 指向 window // 在es5嚴格模式下, 相當于 fn.call(undefined, arg) // 此時 this 指向 undefined
?
對象的成員函數調用
var person = {name: "Brendan Eich", hello: function(thing) { console.log(this + " says hello " + thing)} }person.hello("world") // 寫成原生調用 // person.hello.call(person, "world") // 此時, this 指向person
?
new 調用
function Person(){this.name = 'zhao' } var person = new Person()// 寫成原生調用 function createPerson(){var obj = {}obj.__proto__ = Person.prototypePerson.call(oj) // 此時, this 指向 objreturn obj }varperson = createPerson()
?
?