apply、call 有什么作用,什么区别
每个函数都包含两个非继承而来的方法:apply()和call()。他们的用途相同,都是在特定的作用域中调用函数,就像调用自己的一样,能够扩充函数赖以运行的作用域,如:
function print(a, b, c, d){
alert(a + b + c + d);
}
function example(a, b , c , d){
//用call方式借用print,参数显式打散传递
print.call(this, a, b, c, d);
//用apply方式借用print, 参数作为一个数组传递,
//这里直接用JavaScript方法内本身有的arguments数组
print.apply(this, arguments);
//或者封装成数组
print.apply(this, [a, b, c, d]);
}
//下面将显示”背光脚本”
example(”背” , “光” , “脚”, “本”);
call, apply方法区别是,从第二个参数起, call方法参数将依次传递给借用的方法作参数, 而apply直接将这些参数放到一个数组中再传递, 最后借用方法的参数列表是一样的。
当参数明确时可用call, 当参数不明确时可用apply给合arguments
//例
print.call(window, “背” , “光” , “脚”, “本”);
//foo参数可能为多个
function foo(){
print.apply(window, arguments);
}
代码
以下代码输出什么?
var john = {
firstName: "John"
}
function func() {
alert(this.firstName + ": hi!")
}
john.sayHi = func
john.sayHi()
输出:John:hi!
由于john.sayHi = func
,于是john.sayHi()
在对象john
下执行,this.firstName == "John"
。
下面代码输出什么,为什么
func()
function func() {
alert(this)
}
输出: window
,函数func
在window
下被调用,this
指代window
。
下面代码输出什么
function fn0(){
function fn(){
console.log(this);
}
fn();
}
fn0();
document.addEventListener('click', function(e){ console.log(this);
setTimeout(function(){
console.log(this);
}, 200);
}, false);
输出:window//函数fn0在window下调用
document//绑定的监听事件在document上,this指向document
window//setTimeout函数在全局作用域下执行
下面代码输出什么,why
var john = {
firstName: "John"
}
function func() {
alert( this.firstName )
}
func.call(john)
输出:John
//使用call调用函数func,并且将作用域设置为john,john.firstName == "John"
代码输出?
var john = {
firstName: "John",
surname: "Smith"
}
function func(a, b) {
alert( this[a] + ' ' + this[b] )
}
func.call(john, 'firstName', 'surname')
输出:John Smith
//call改变函数func作用域为john,并且传入了参数 ('firstName','surname')
以下代码有什么问题,如何修改
var module= {
bind: function(){
$btn.on('click', function(){
console.log(this) //this指什么(this指$btn)
this.showMsg();
})
},
showMsg: function(){
console.log('饥人谷');
}
}
可修改为:
var module= {
var me = this;
bind: function(){
$btn.on('click', function(){
console.log(this) //this指什么(this指$btn)
me.showMsg();
})
},
showMsg: function(){
console.log('饥人谷');
}
}
本文版权归本人(帘外修竹)所有,转载须说明来源