apply、call 有什么作用,什么區(qū)別
答:
- this的指向:
this是函數(shù)內(nèi)部的屬性,既可以是全局對(duì)象、也可以是當(dāng)前對(duì)象或者任意對(duì)象。但總有一個(gè)原則,指的是函數(shù)調(diào)用的那個(gè)對(duì)象。
1.在全局調(diào)用的時(shí)候指向是window。
2.作為對(duì)象的方法調(diào)用的時(shí)候指的是那個(gè)對(duì)象。
3.構(gòu)造函數(shù)的時(shí)候指的是構(gòu)造出來(lái)的那個(gè)對(duì)象。
4.在事件綁定中的this,指向調(diào)用事件綁定的document對(duì)象。
5.函數(shù)嵌套中的function的this指向window。
6.setTimeout和setlnterval中的this指向window。
apply與call的作用:
apply、call的作用是相同的,都是指定函數(shù)的this和參數(shù)來(lái)調(diào)用函數(shù),使用apply與call可以使this的指向更為清晰。
apply與call的區(qū)別,他們的區(qū)別在于傳遞給函數(shù)的參數(shù),apply接收的是數(shù)組的形式,call接收的是多個(gè)參數(shù)。
例子:
var name = 'hello';
var obj = {
name: 'jirengu',
};
var obj1 = {
name:'syc'
};
function sayName() {
console.log(this.name)
}
//全局調(diào)用, 默認(rèn)指向window
sayName()//輸出'hello'
//作為obj的方法調(diào)用, 指向obj
obj.sayName = sayName
obj.sayName()//輸出'jirengu'
//使用call指定this值
sayName.call(obj1)//輸出'syc'
代碼:
1.以下代碼輸出什么?
var john = {
firstName: "John"
}
function func() {
alert(this.firstName + ": hi!")
}
john.sayHi = func
john.sayHi() //輸出:John:hi!
2.下面代碼輸出什么,為什么
func()
function func() {
alert(this)
}//輸出[object Window] 因?yàn)樗侨謱?duì)象調(diào)用的函數(shù),所以是window
3.下面代碼輸出什么
function fn0(){
function fn(){
console.log(this);
}
fn();
}
fn0();//這里是全局調(diào)用函數(shù)所以是Window
document.addEventListener('click', function(e){
console.log(this);//這里的this指的是addEventListener的對(duì)象,所以是document
setTimeout(function(){
console.log(this);
}, 200);
}, false);//這里的setTimeout是全局調(diào)用的函數(shù)所以是window
4下面代碼輸出什么,why
var john = {
firstName: "John"
}
function func() {
alert( this.firstName )
}
func.call(john)
//結(jié)果是john,因?yàn)閏all指向了this為john
5.代碼輸出?
var john = {
firstName: "John",
surname: "Smith"
}
function func(a, b) {
alert( this[a] + ' ' + this[b] )
}
func.call(john, 'firstName', 'surname')
//結(jié)果為Jhon Smith因?yàn)閏all指定了傳入對(duì)象為john而且它可以傳入多個(gè)參數(shù),所以結(jié)果是這個(gè)。
6.以下代碼有什么問(wèn)題,如何修改
var module= {
bind: function(){
$btn.on('click', function(){
console.log(this) //當(dāng)btm被點(diǎn)擊的時(shí)候this指的btn
this.showMsg();
})
},
showMsg: function(){
console.log('饑人谷');
}
}
//
問(wèn)題:this,showMsg()當(dāng)點(diǎn)擊$btn時(shí)this指的是btn而不是module,所以饑人谷將無(wú)法被打印。
修改:
var module= {
bind: function(){
var cur = this;
$btn.on('click', function(){
console.log(this)
cur.showMsg();
})
},
showMsg: function(){
console.log('饑人谷');
}
}