01-修改this指向【apply、call、bind】
参考答案
function bindThis(f, oTarget) {
//方法一:apply
// return function(){
// return f.apply(oTarget,arguments);
// }
//方法二:call
// return function(x,y){
// return f.call(oTarget,x,y);
// }
//方法三:bind
//return f.bind(oTarget);
//方法四:答案考虑了浏览器兼容问题,如果bind方法失效,就返回一个apply过得方法;
// 如上文所说,apply是立即执行,bind是返回方法,所以在apply外层包上一层函数。
if (f.bind) {
return f.bind(oTarget);
}
else {
return function () {
return f.apply(oTarget, arguments);
}
}
}
本题复习知识点:bind apply call
- 共同点
- 三者都是function的内建方法(js中function函数也是一种对象)
- 三者都是用来改变函数的this对象的指向的;
- 三者第一个参数都是this要指向的对象,也就是想指定的上下文
- 三者都可以利用后续参数传参
- 不同点:
- bind 可以直接返回这个更换this的函数,便于稍后调用,只是改变了执行的上下文,并未立即执行而是回调执行,因此在运行时需要在后面加入()才能表示和apply、call相同的结果;
- apply 、call 则是立即调用 。
- apply、call之间是传参数形式的区别,前者是参数数组,后者是参数项,
涉及的基础知识点
- this是Javascript语言的一个关键字。它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。随着函数使用场合的不同,this的值会发生变化。但是有一个总的原则,那就是this指的是调用函数的那个对象。
- 在JavaScript中,call、apply和bind是Function对象自带的三个方法,这三个方法的主要作用是改变函数中的this指向。
- this的使用情况:
1、作为普通函数调用,这是函数的最通常用法,属于全局性调用,因此this就代表全局对象。
2、作为对象方法的调用,函数还可以作为某个对象的方法调用,这时this就指这个上级对象。
3、作为构造函数调用,所谓构造函数,就是通过这个函数生成一个新对象(实例)。这时,this就指这个新对象(实例)。
涉及的参考链接
前端-js编程题1-封装函数f,使f的this指向指定的对象
——
JS中的this对象详解
——
this的指向及作用,function的封装
——
理解JS中的call、apply、bind方法