js中的this

日常用this不少,对this的理解就是this是对应执行环境,然而不少时候效果并非想要的,最近看了一些谈到this的笔记和书籍,总结下。数组

对this的误解:app

this是指向函数自己函数

先上个demo吧this

复制代码
1   var a =0;
2     demo.a=2;
3     function demo(){
4         console.log('ok');
5         this.a++
6     }
7     demo();//ok
8     console.log(demo.a);//2
9     console.log(a); //1
复制代码

 上面的demo已经得知,若是this是指向函数自己,那么demo.a的值应该为3,但仍是2说明调用的不是demo函数。spa

 window对象的a却增长了,说明demo函数中的this是指向window(等会说为何)code

this是在调用时被绑定的,取决于函数的调用位置(也就是调用方法):对象

1.默认绑定:blog

最经常使用也是函数调用类型,当只有一个独立函数时,this指向的是window对象(解释上面例子为何console.log(a)会是1)。it

注意:当使用严格模式,this会绑定到undefinedio

2.隐式绑定

函数调用的位置有上下文环境(我理解为对象调用模式,函数是一个对象的方法)

复制代码
var obj1={
a:2,
demo:demo
};
var obj={
a:1,
obj1:obj1
};
function demo(){
console.log(this.a)
}
obj.obj1.demo()//2
复制代码

当函数的执行环境是在obj对象,this指向的就是obj。若是被包裹了几层对象,this只会绑定最后一层对象(上面demo中this最后绑定到obj1上)

注意:1.有时咱们不会写这么长一串obj.obj1.demo,而是赋给一个变量,还能达到咱们想要的效果吗?

复制代码
 1     var a =0
 2     var obj1={
 3         a:2,
 4         demo:demo
 5     };
 6     var obj={
 7         a:1,
 8         obj1:obj1
 9     };
10     function demo(){
11         console.log(this.a)
12     }
13     obj.obj1.demo(); //2
14     var fn= obj.obj1.demo;
15     fn(); //0 
16     obj.dd = obj.obj1.demo;
17     obj.dd() //1
复制代码

当我把obj.obj1.demo赋给fn时,再执行fn(),结果倒是0.why? 按照咱们上面说的,fn()能够理解为一个独立函数(没有任何修饰符),其中的this就是指向window,即a=0。

我以为还能这么理解,函数中this,取决于调用函数上一级(也就是上面说的最后一级)的对象。

如上:obj.dd = obj.obj1.demo,而后执行obj.dd(),结果是1,也就是说如今函数中你的this绑定的是obj对象。同理也能够解释fn()其实就是window.fn(),绑定的是window对象

3.显示绑定

显示绑定就是经过apply,call,bind,直接将函数中的this绑定到想要的对象上

仍是先看demo吧

复制代码
 1     var obj1={
 2         a:2,
 3         demo:demo
 4     };
 5     var obj={
 6         a:1,
 7         obj1:obj1
 8     };
 9     function demo(){
10         console.log(this.a)
11     }
12     obj.obj1.demo(); //2
13     obj.obj1.demo.call(obj); //1
14     var fn= obj.obj1.demo.bind(obj);
15     fn() //1
复制代码

简单介绍下apply call bind。apply和call是函数内置的方法,第一个参数是指定函数执行环境,第二个参数是传给函数的参数,call是将参数依次传给函数,apply则是将参数组合在一个数组中,将数组传给函数,

bind也是绑定指定执行环境,可是不会执行(使用call和apply的时,函数就执行了)

根据上面说的,正常obj.obj1.demo()获得的结果是2,可是使用call后this绑定的obj上,因此a的值为1.后面使用bind同理(只是函数没有执行,须要执行一次)

4.构造函数模式

建立一个构造函数的实例,构造函数中的this会绑定到这个实例对象上

1     function Per(){
2        this.a=1
3     }
4     var dd = new Per();
5     alert(dd.a) //1

 

 dd是Per的一个实例,this绑定在dd上,建立了dd的一个属性a,且值为1

相关文章
相关标签/搜索