问答
- apply、call 有什么作用,什么区别
1.function.prototype.call()
函数实例的call方法可以指定函数内部this的指向,即函数执行时所在的作用域
var obj = {};
var fn = function(){
return this
}
fn() === this // true
fn.call(obj) === obj // true
fn()执行时所在的作用域是全局环境,所以this是window,而fn.call(obj)则是在对象obj环境下执行的,所以此时的this指向obj。
fn.call(null) === this
fn.call(undefined) === this
fn.call === this
call方法内部的参数如果为空、null和undefined,则默认传入全局对象。
var obj = {};
var add = function(x,y){
return x+y
}
add.call(obj,2,3)
call方法还可以接受多个参数。call的第一个参数就是this所要指向的那个对象,后面的参数则是函数调用时所需的参数。
2.function.prototype.apply()
apply方法的作用与call方法类似,也是改变this指向,然后再调用该函数。唯一的区别就是,它接收一个数组作为函数执行时的参数。
function fn(x,y){
return x+y
}
fn.call(null,1,1)//2
fn.apply(null,[1,1])//2
fn函数本来接受两个参数,使用apply方法以后,就变成可以接受一个数组作为参数。
代码
1.以下代码输出什么?
Johb:hi!
2.下面代码输出什么,为什么
[object Window]
因为该函数的执行环境是全局环境window
3.下面代码输出什么
window对象//调用函数fn时的全局环境是在window下
文档对象//点击文档时执行回调函数,此时回调函数的执行环境是文档对象
window对象//点击文档后过0.2秒后,此时回调函数的执行环境已经变为全局环境
4.下面代码输出什么,why
John
函数实例func调用call方法,使其执行环境在对象john下.
所以,函数func内部的this指向john对象
5.代码输出?
John Smith
6.以下代码有什么问题,如何修改
var module= {
bind: function(){
$btn.on('click', function(){
var that =this
console.log(this)
//this指的是$btn
that.showMsg()
} )
},
showMsg: function(){
console.log('饥人谷');
}
}