题解 | #修改 this 指向#
修改 this 指向
http://www.nowcoder.com/practice/a616b3de81b948fda9a92db7e86bd171
{"js":
function bindThis(f, oTarget) {
return function() {
return f.apply(oTarget,arguments);
}
}
解题思路:this默认指向是windows全局对象,现有需求改变this的指向,this就是谁调用它就指向谁,
1、可以使用call或者apply来强行改变this的指向
例子一:
function foo() {
console.log(this.a);
}
var obj = {a:2};
var bar = function() {
foo.call(obj);
};
bar(); //2 强行将this的指向绑定到obj上,所以输出的a=2,注意:强行改变指向后不能再修改它的this。
例子二:
function foo(some) {
console.log(this.a, some);
return this.a + some;
}
var obj = {a:2};
var bar = function() {
return foo.apply(obj,arguments);
}
var b = bar(3); // 2 3
console.log(b); // 5
在此基础上封装一个辅助函数:
function foo(some) {
console.log(this.a, some);
return this.a + some;
}
function bind(fn,obj) {
return function() {
return fn.apply(obj,arguments);
};
}
var obj = {a:2};
var bar = bind(foo,obj);
var b = bar(3); // 2 3
console.log(b); // 5
也就是题目上封装的函数,在此基础上ES5提供了内置的方法,Function.prototype.bind,也就是 不需要封装,直接用bind函数就行
把上述的封装函数去掉,直接调用 var bar = foo.bind(obj)就可以实现修改this指向。