javascript 中this指向并不是在函數(shù)定義的時(shí)候確定的塔淤,而是在函數(shù)調(diào)用時(shí)確定的流礁,也就是說,函數(shù)的調(diào)用方式?jīng)Q定了this的指向妹蔽。
JavaScript中普通函數(shù)調(diào)用方式有三種:直接調(diào)用椎眯,方法調(diào)用和new調(diào)用,還有一些特殊調(diào)用胳岂,比如编整,通過bind()將函數(shù)綁定到對(duì)象之后再進(jìn)行調(diào)用,通過call()乳丰,apply()進(jìn)行調(diào)用等
直接調(diào)用
即為通過函數(shù)名()調(diào)用掌测,這是,函數(shù)內(nèi)部的this指向全局變量产园,在瀏覽器中全局對(duì)象是window汞斧,在nodejs中全局對(duì)象是global
需要注意的是,直接調(diào)用不只是全局作用下進(jìn)行調(diào)用淆两,在任何作用域下断箫,只要通過函數(shù)名()調(diào)用,都叫做直接調(diào)用
bind()對(duì)直接調(diào)用的影響
Function.protype.bind()作用是將當(dāng)前函數(shù)與指定的對(duì)象綁定秋冰,并返回一個(gè)新函數(shù)仲义,這個(gè)函數(shù)無論以什么樣的方式調(diào)用,其this始終指向綁定的對(duì)象
var obj={};
function test(){
console.log(this==obj);
}
var testObj = test.bind(obj);
test();//false
testObj();true
call()和apply()對(duì)this的影響
Function.protype.apply()和Function.protype.call()第一個(gè)參數(shù)指向函數(shù)運(yùn)行時(shí)this指向,不過使用apply和call的時(shí)候仍然需要注意埃撵,如果目錄函數(shù)本身是一個(gè)綁定了this對(duì)象的函數(shù)赵颅,那apply和call不會(huì)像預(yù)期那樣執(zhí)行,例
var obj = {};
function test(){
console.log(this===obj);
}
//綁定一個(gè)新對(duì)象
var testObj = test.bind({});
test.apply(obj);//true
testObj.apply(testObj);//false