# this

this是谁调用指谁,没人调用要看代码是否运行在严格模式,如果不是严格模式指window,如果是严格模式this是undefined,使用时会报错。

//例1
this.a = 10;
function test =  {
    a: 20,
    init: function() {
        console.log(this.a);
    }
}
test.init();//输出20

//例2
this.a = 10;
function test =  {
    a: 20,
    init: function() {
        function go() {
            console.log(this.a);
        }
        go();

    }
}
test.init();//go没有人调用,go函数里的this指向window,输出10

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

WARNING

注意,例2中,如果代码前面加了 use strict,代码运行在严格模式下,会报错:can not read property 'a' of undefined,也就是说此时thisundefined

严格模式只对声明所在的函数内生效,

 var num = 1;
 function test() {
     console.log(this.num++);
 }

 (function(){
     "use strict"
     test();
 })()
 //这时不会报错,输出1

1
2
3
4
5
6
7
8
9
10
11
//例3
this.a = 10;
function test =  {
    a: 20,
    init: function() {
        function go() {
            console.log(this.a);
        }
        return go;

    }
}
var go = test.init();
go();//输出10,此时go中的this指window
1
2
3
4
5
6
7
8
9
10
11
12
13
14

new一个函数或者对象时,此时应注意this指向的问题。构造函数的this优先级会大于原型链。

//例4
this.a = 30;
function go() {
    console.log(this.a)
    this.a = 10;
}
go.prototype.a = 20;

console.log((new go()).a);
//输出20, 10
1
2
3
4
5
6
7
8
9
10

如果是箭头函数包裹里的this,this指向其父级作用域。

this.a = 10;
function test =  {
    a: 20,
    init: () => {
        console.log(this.a)
    }
}
test.init();
//输出10 this指向test所在的作用域
1
2
3
4
5
6
7
8
9
最后更新时间: 8/31/2020, 12:17:57 AM