对于此代码块,我已将函数的“this”上下文更改为作为数组实例的对象
function arrayContext(other_values){
//...
console.log(this);
//... do something with other_values
}
arrayContext.call([1],some_other_values)
但是这样做的目的是什么?在什么情况下更改函数的上下文会很有用?
对于此代码块,我已将函数的“this”上下文更改为作为数组实例的对象
function arrayContext(other_values){
//...
console.log(this);
//... do something with other_values
}
arrayContext.call([1],some_other_values)
但是这样做的目的是什么?在什么情况下更改函数的上下文会很有用?
我认为.call
, .apply
and .bind
, call 可能是最少使用的——但所有 3 种方法都用于更改函数的范围。
在我看来.bind
是最有用的,因为它返回一个具有强制作用域的函数,在哪里.call
并.apply
会立即执行一个函数。
举一个人为的例子,如果你想在保持对象范围的同时使用某些方法作为事件处理程序,那么你将使用绑定,否则范围将更改为我们将事件绑定到的元素。
var singleton = {
prop: 'howdy do!',
method: function() {
this.doSomething();
},
doSomething: function() {
console.log(this.prop);
}
};
$('#thing').on('click',singleton.method.bind(singleton));
.apply
最常用于将单个数组转换为参数集合。
var args = ['one', 2, false];
var singleton = {
setStuff: function(place, index, isSomething) {
this.place = place;
this.index = index;
this.isSomething = isSomething;
}
};
singleton.setStuff.apply(singleton, args);
.call
通常用于利用某些通常不可用的原型方法。
function myFunc() {
// arguments isn't an array, so it doesn't have access to slice
// however, by scoping the slice method to arguments, we can still use it
var args = Array.prototype.slice.call(arguments, 0);
singleton.setStuff.apply(singleton, args);
}