apply、call 有什么作用,什么区别
答:
- this的指向:
this是函数内部的属性,既可以是全局对象、也可以是当前对象或者任意对象。但总有一个原则,指的是函数调用的那个对象。
1.在全局调用的时候指向是window。
2.作为对象的方法调用的时候指的是那个对象。
3.构造函数的时候指的是构造出来的那个对象。
4.在事件绑定中的this,指向调用事件绑定的document对象。
5.函数嵌套中的function的this指向window。
6.setTimeout和setlnterval中的this指向window。
apply与call的作用:
apply、call的作用是相同的,都是指定函数的this和参数来调用函数,使用apply与call可以使this的指向更为清晰。
apply与call的区别,他们的区别在于传递给函数的参数,apply接收的是数组的形式,call接收的是多个参数。
例子:
var name = 'hello';
var obj = {
name: 'jirengu',
};
var obj1 = {
name:'syc'
};
function sayName() {
console.log(this.name)
}
//全局调用, 默认指向window
sayName()//输出'hello'
//作为obj的方法调用, 指向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] 因为它是全局对象调用的函数,所以是window
3.下面代码输出什么
function fn0(){
function fn(){
console.log(this);
}
fn();
}
fn0();//这里是全局调用函数所以是Window
document.addEventListener('click', function(e){
console.log(this);//这里的this指的是addEventListener的对象,所以是document
setTimeout(function(){
console.log(this);
}, 200);
}, false);//这里的setTimeout是全局调用的函数所以是window
4下面代码输出什么,why
var john = {
firstName: "John"
}
function func() {
alert( this.firstName )
}
func.call(john)
//结果是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')
//结果为Jhon Smith因为call指定了传入对象为john而且它可以传入多个参数,所以结果是这个。
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('饥人谷');
}
}