apply、call 有什么作用,什么区别
- apply()是函数对象的一个方法,它的作用是改变函数的调用对象,即this的指向
- 区别是:call接收的是参数列表,需要传入所需要的每一个参数,apply接收的是参数数组,参数存放在数组中
fn.call(context, param1, param2…)
fn.apply(context, paramArray)
···
如果第一个参数为null,则this指向全局对象window,
代码
1. 以下代码输出什么?
1 | var john = { |
弹出 John hi!,因为.sayHi() 是作为john对象的一个方法执行的,this从window指向了调用它的对象john
2.下面代码输出什么,为什么
1
2
3
4
5func()
function func() {
alert(this)
}[Object Window],函数声明前置,所以func()可以执行,因为在全局环境执行下调用,所以输出Window
3.下面代码输出什么
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15function fn0(){
function fn(){
console.log(this);
}
fn();
}
fn0();
document.addEventListener('click', function(e){
console.log(this);
setTimeout(function(){
console.log(this);
}, 200);
}, false);fn0(); 执行输出全局window对象,虽然this在嵌套函数中,但是调用的依然是window对象
- 输出document,document绑定事件执行的函数,绑定事件的this指向原DOM对象
输出window对象,因为setTimeout是全局作用域下的一个方法,函数调用时指向window对象
4.下面代码输出什么,why
1
2
3
4
5
6
7
8var john = {
firstName: "John"
}
function func() {
alert( this.firstName )
}
func.call(john)John,call函数改变this的指向,func.call(john) 代表在john对象下执行函数func().
5.代码输出?
1
2
3
4
5
6
7
8
9var john = {
firstName: "John",
surname: "Smith"
}
function func(a, b) {
alert( this[a] + ' ' + this[b] )
}
func.call(john, 'firstName', 'surname')弹出John Smith
6.以下代码有什么问题,如何修改
1
2
3
4
5
6
7
8
9
10
11
12
13var module= {
bind: function(){
var _self = this;//保存module的this指向,在函数内部使用
$btn.on('click', function(){
console.log(this) //this指什么,this指的是dom对象btn
_self.showMsg();//使用保存的module的this,可以调用module的showMsg()函数
})
},
showMsg: function(){
console.log('饥人谷');
}
}