問答
理解this
this不是編寫時綁定耳舅,而是運行時綁定碌上。它依賴于函數(shù)調(diào)用的上下文條件。this綁定和函數(shù)聲明的位置無關(guān)浦徊,反而和函數(shù)被調(diào)用的方式有關(guān)绍赛。
函數(shù)是和new一起被調(diào)用的嗎(new綁定)?如果是辑畦,this就是新構(gòu)建的對象吗蚌。
var bar = new foo()
函數(shù)是用call或apply被調(diào)用(明確綁定),甚至是隱藏在bind 硬綁定 之中嗎纯出?如果是蚯妇,this就是明確指定的對象敷燎。
var bar = foo.call( obj2 )
函數(shù)是用環(huán)境對象(也稱為擁有者或容器對象)被調(diào)用的嗎(隱含綁定)?如果是箩言,this就是那個環(huán)境對象硬贯。
var bar = obj1.foo()
否則,使用默認的this(默認綁定)陨收。如果在strict mode下饭豹,就是undefined,否則是global對象务漩。
var bar = foo()
以上拄衰,就是理解對于普通的函數(shù)調(diào)用來說的this綁定規(guī)則所需的全部。是的···幾乎是全部饵骨。
?? apply翘悉、call有什么作用,什么區(qū)別居触。
- apply()和call()函數(shù)都可以指定this值和參數(shù)值的情況下調(diào)用某個函數(shù)妖混。
- call()和apply()的作用一樣,區(qū)別在于提供給原函數(shù)的參數(shù)的方式不一樣
- apply()函數(shù)數(shù)只接受兩個參數(shù)轮洋,提供給原函數(shù)的參數(shù)以數(shù)組或類數(shù)組對象的形式存在
- call()接收無限個參數(shù)制市, 第二個參數(shù)及其后面的參數(shù)就是提供給原函數(shù)的參數(shù)。
代碼
- 下面代碼輸出什么弊予,為什么
var john = {
firstName: "John"
}
function func() {
alert(this.firstName + ": hi!")
}
john.sayHi = func
john.sayHi() // ??輸出John:hi息堂!
- 下面代碼輸出什么,為什么
func() ?? //輸出window對象
function func() {
alert(this)
}
因為是全局變量調(diào)用函數(shù)
- 下面代碼輸出什么块促,為什么
function fn0(){
function fn(){
console.log(this); ?? //輸出window對象
}
fn();
}
fn0();
document.addEventListener('click', function(e){
console.log(this);?? //輸出document對象因為document調(diào)用
setTimeout(function(){
console.log(this);?? //輸出window對象
}, 200);
}, false);
- 下面代碼輸出什么,why?
var john = {
firstName: "John"
}
function func() {
alert( this.firstName )
}
func.call(john)
通過call()函數(shù)調(diào)用床未,此時this為John對象竭翠,輸出"John"
- 下面代碼輸出什么,為什么
var john = {
firstName: "John",
surname: "Smith"
}
function func(a, b) {
alert( this[a] + ' ' + this[b] )
}
func.call(john, 'firstName', 'surname')
彈出 john smith
薇搁。
因為 call方法可以接收 參數(shù)列表斋扰。
- 以下代碼有什么問題,如何修改
var module= {
bind: function(){
$btn.on('click', function(){
console.log(this) //this指的是$btn
this.showMsg();
})
},
showMsg: function(){
console.log('饑人谷');
}
}
改為
var module= {
bind: function(){
var me = this; ?? 存在變量中
$btn.on('click', function(){
console.log(this)
me.showMsg(); ?? 再調(diào)用
})
},
showMsg: function(){
console.log('饑人谷');
}
}
this資料
本文版權(quán)歸作者_Josh和饑人谷所有啃洋,轉(zhuǎn)載請注明來源