apply、call 有什么作用,什么區(qū)別
答:
- this的指向:
this是函數(shù)內(nèi)部的屬性,既可以是全局對象、也可以是當前對象或者任意對象。但總有一個原則,指的是函數(shù)調(diào)用的那個對象。
1.在全局調(diào)用的時候指向是window。
2.作為對象的方法調(diào)用的時候指的是那個對象。
3.構(gòu)造函數(shù)的時候指的是構(gòu)造出來的那個對象。
4.在事件綁定中的this,指向調(diào)用事件綁定的document對象。
5.函數(shù)嵌套中的function的this指向window。
6.setTimeout和setlnterval中的this指向window。
apply與call的作用:
apply、call的作用是相同的,都是指定函數(shù)的this和參數(shù)來調(diào)用函數(shù),使用apply與call可以使this的指向更為清晰。
apply與call的區(qū)別,他們的區(qū)別在于傳遞給函數(shù)的參數(shù),apply接收的是數(shù)組的形式,call接收的是多個參數(shù)。
例子:
var name = 'hello';
var obj = {
name: 'jirengu',
};
var obj1 = {
name:'syc'
};
function sayName() {
console.log(this.name)
}
//全局調(diào)用, 默認指向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] 因為它是全局對象調(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的對象,所以是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,因為call指向了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因為call指定了傳入對象為john而且它可以傳入多個參數(shù),所以結(jié)果是這個。
6.以下代碼有什么問題,如何修改
var module= {
bind: function(){
$btn.on('click', function(){
console.log(this) //當btm被點擊的時候this指的btn
this.showMsg();
})
},
showMsg: function(){
console.log('饑人谷');
}
}
//
問題:this,showMsg()當點擊$btn時this指的是btn而不是module,所以饑人谷將無法被打印。
修改:
var module= {
bind: function(){
var cur = this;
$btn.on('click', function(){
console.log(this)
cur.showMsg();
})
},
showMsg: function(){
console.log('饑人谷');
}
}