推荐博客: https://www.cnblogs.com/huaxili/p/5407559.html
this 是 JavaScript 的一个关键字, 表示的不是对象本身, 而是指被调用的上文.
主要用于以下四种环境:
1. 直接调用, 表示的是全局对象, Windows
2. 作为对象方法被调用, 表示的是该对象
3. 作为构造函数被调用, 表示的是创建的实例
4. 可以使用 apply(),call() 改变 this 的表示对象, 第一个参数就是 this
直接调用, 表示的是全局对象, Windows
- var count = 1;
- function func(){
- console.log(this.count);
- }
- func(); //1
调用函数的结果是 1, 即 this 指的是全局对象, Windows, 所以 count 值为全局变量的值
作为对象方法被调用, 表示的是该对象
- var count = 1;
- function func(){
- console.log(this.count);
- }
- var obj = {
- };
- obj.count = 2;
- obj.show = func;
- obj.show(); //2
func() 方法作为对象的方法被调用, 此时 this 表示的被调用的对象 obj, 所以 count 值为 obj 对象中的值 count, 若是对象 obj 中没有 count 属性, 则为 undefined
作为构造函数被调用, 表示的是创建的实例
- var count = 1;
- function func(){
- this.count = 2;
- }
- var Func = new func();
- console.log(count); //1
- console.log(Func.count); //2
func() 作为构造函数, 创建了他的实例, 此时 this 表示的是创建的实例 Func
可以使用 apply(),call() 改变 this 的表示对象, 第一个参数就是 this
apply() 是函数对象的一个方法, 它的作用是改变函数的调用对象 (实则是将某某对象的某个方法放到另一个好基友对象那里去执行), 它的第一个参数就表示改变后的调用这个函数的对象. 因此, this 指的就是这第一个参数. 同 call()
- var count = 1;
- function func(){
- console.log(this.count);
- }
- var obj = {};
- obj.count = 2;
- func.call(); //1
- func.call(obj); //2
可以使用 apply() 或是 call() 来改变 this 指向. 此时 this 表示的是 obj 对象
嵌套函数作用域中的 this
- var count = 1;
- function func(){
- console.log(this.count);
- function func2(){
- console.log(this.count);
- }
- func2();
- }
- var obj = {};
- obj.count = 2;
- obj.show = func;
- obj.show(); //2,1
嵌套函数被调用时并没有继承被嵌套函数的 this 引用, 在嵌套函数被调用时, this 指向全局对象. 在有些应用中, 我们需要在嵌套函数中读取调用被嵌套函数的对象的属性, 此时可以声明一个局部变量保存 this 引用,
- var count = 1;
- function func(){
- console.log(this.count);
- var self = this;
- function func2(){
- console.log(self.count);
- }
- func2();
- }
- var obj = {};
- obj.count = 2;
- obj.show = func;
- obj.show(); //2,2
此时, 嵌套函数与被嵌套函数中的 this 都表示了 obj 对象.
来源: http://www.bubuko.com/infodetail-2928960.html