一 this 关键字
1.1 概念
- this 简单来说指的是属性或方法或全局的当前对象,始终会返回一个对象。
- 在全局上下文的执行环境中,this的值会指向全局变量,在浏览器中则引用windows对象;
在函数上下文的执行环境中,this的取值取决于该函数是如何被调用的。如果它被一个引用对象调用,比如其上层对象,则会指向其上层对象,否则会被设为全局对象或者在严格模式下的undefined。
let obj = {
age: 1,
func: function () {
console.log(this);
},
}
obj.func(); //this指向其上层环境obj
let foo = obj.func;
foo(); //this指向顶层环境Windows
- 在JavaScript中,也是一切皆对象,运行环境也是对象。在 JS 运行时,this就是函数运行时所在的环境(对象),运行时环境可以动态切换,则 this 的指向则是动态的。如上例中,JS 运行时,将 obj 中 func 函数赋值给 foo ,而foo 运行的环境是在windows即顶级环境下,this 也随之变化。
1.2 使用场合
(1) 全局环境:
无论在函数内还是函数外,在全局环境下运行时,this指的都是其顶层对象windows
this === window // true
function f() {
console.log(this === window);
}
f() // true
(2)构造函数
构造函数中使用的this,代指实例对象,构造函数中this指向属性,就相当于实例对象就拥有了该属性
var Obj = function (p) {
this.p = p;
};
var o = new Obj('Hello World!');
o.p // "Hello World!"
(3)对象的方法
- 如例1.1 中 func 为 obj 对象的一个方法,可以理解为 obj、obj.func 在JS运行时保存着两种不同的环境,若调用obj 的地址 再调用obj.func 的地址时,obj.func 则会在obj 的环境下运行,若赋值后直接运行 func 则会在全局环境下运行
- 而在多层对象的情况下,this 会指向上一层的对象,而不是最外层,下例中,this 运行环境是a.m ,而在 a.m 对象中p 没有定义,则返回undefined。
var a