0114重点: js中的this指向 及 call, apply ,bind 函数解决的问题
参考文献: http://www.cnblogs.com/pssp/p/5216085.html
一, this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象
1. 一个有名函数,如果直接执行: 函数名(); 那么调用这个函数的就是wndow. 函数中的this是指 window; 因为window是全局对象;
window是js中的全局对象,我们创建的变量实际上是给window添加属性,
2. 如果函数是被一个对象调用. 对象A. fn() 那么this指的就是这个对象对象A.
如果函数是一个对象内包含的另一个对象的属性.(对象包对象), 那么调用的时候是: 对象A.对象B.fn(); 那么this指的是fu所在的那个对象,即 对象B
3. 如果把对象A.对象B.fn 赋值给对象C, 即 c = a.b.fn ;然后直接 c(); 这个时候this指的是window, 道理同第一点.
4.构造函数 new 出的新对象, this 都是指向构造函数模版. 等同于copy;
5. 如果 函数最后有 return; 那么判断下,:
如果return的是一个对象,那么方法执行的时候, this指的就是return的对象.
如果return的不是对象, 而是一个数字, 或者 null, 或者 undefined 的话, this 指的还是原来函数.;
二, 使用 call, apply, bind 解决的问题:
参考 : https://www.cnblogs.com/pssp/p/5215621.html
当有时候我们不得不将一个带方法的对象保存到另外的一个变量中,为了要能访问到原对象中的方法或属性, 我们就得用call, apply, bind 方法来传递原对象的上下文,环境.
如上分析的第3条:
var a = {
user:"追梦子",
fn:function(){
console.log(this.user); //追梦子
}
}
var b = a.fn;
b(); // 如果直接这样执行,是不能打印出的
b.call(a); // 解决方法,是用call函数, 把 a 作为环境(上下文),添加到 b变量里.(把a的环境传给b)
b.apply(a);
带参写法:
b.call(a,1,2);
b.apply(a,[10,1]);
注意如果call和apply的第一个参数写的是null,那么this指向的是window对象;
以下是bind的写法: 与 all apply 不同, 实际上bind方法返回的是一个修改过后的函数。
var c = b.bind(a,10); c(1,2);
bind也可以有多个参数,并且参数可以执行的时候再次添加,但是要注意的是,参数是按照形参的顺序进行的。
总结:call和apply都是改变上下文中的this并立即执行这个函数,bind方法可以让对应的函数想什么时候调就什么时候调用,并且可以将参数在执行的时候添加,这是它们的区别,根据自己的实际情况来选择使用。
浙公网安备 33010602011771号