Javascript this

this关键字在JavaScript中是一个动态变化的值,让初学者或者基础知识不扎实的人对它的理解不够,导致阅读别人代码或者自己写的时候出错,让我们开始学习它吧。

全局对象

在全局范围内(不在任何方法内),这就指全局对象,这时this等同于window。

1
2
3
4
5
6
/* this 等于 window */
console.log(this === window); // true

var a = "aaa";
console.log(window.a); // "aaa"
console.log(this.a); // "aaa"

方法内部

在一个方法内部,this的值取决于这个函数是怎么被调用的。

demo1 – 普通调用

1
2
3
4
5
function f1() {
return this;
}

console.log(f1() === window); // true

没在严格模式下,this默认是一个全局对象。

1
2
3
4
5
6
"use strict";
function f1() {
return this;
}

console.log(f1() === undefined); // true

在严格模式下,this等于给它设置的值,因为没有设置,所以就是undefined了。

demo2 – 对象方法调用

1
2
3
4
5
6
7
8
var obj = {
age: 27,
getAge: function() {
return this.age;
}
};

console.log(obj.getAge()); // 27

而当函数被作为某个对象的方法调用时,this等于那个对象。不过匿名函数的执行环境具有全局性,因此其 this 对象通常指向 window(通过 call()或apply()改变函数执行环境的情况下,this 就会指向其他对象)。

1
2
3
4
5
6
7
8
9
10
11
var age = 90;
var obj = {
age: 27,
getAge: function() {
return function() {
return this.age;
}
}
}

console.log(obj.getAge()()); // 90

每个函数在调用时,都会去获取2个值:arguments和this。匿名函数在获取这2个值时,只会搜索自己执行环境中的,永远不会直接访问外部函数或执行环境中的这2个变量。而this指向的是自己的调用者,匿名函数的调用者=window,所以this指向window。

1
2
3
4
5
6
7
8
9
10
11
12
var age = 90;
var obj = {
age: 27,
getAge: function() {
var _this = this;
return function() {
return _this.age;
}
}
}

console.log(obj.getAge()()); // 27

要想让getAge方法获取自己对象中的age属性,需要在调用闭包前给this赋值。

坚持原创技术分享,您的支持将鼓励我继续创作!