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方法可以让对应的函数想什么时候调就什么时候调用,并且可以将参数在执行的时候添加,这是它们的区别,根据自己的实际情况来选择使用。
 

 

posted on 2018-01-14 17:07  水月纯明  阅读(135)  评论(0)    收藏  举报

导航