this的指向问题及修改指向

Posted sltk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了this的指向问题及修改指向相关的知识,希望对你有一定的参考价值。

this指的当前对象,如果在全局访问内使用this,则指向当前页面的window; 如果在函数中使用this,则this是指代什么是根据当前函数在什么对象上调用。

1 console.log(this === window); // true
2 console.log(window.alert === this.alert); // true
3 console.log(this.parseInt(‘021‘, 10)); //21
parseInt(string, radix);
// 在只使用一个参数时,是将其转为整数
// radix取值是2~36,表示当前数是几进制,并将这个数转为十进制,当不在这个范围时,会输出NaN

函数中的this是运行时决定的,而不是函数定义时。

 1 foo() {
 2     console.log(this.name);
 3 }
 4 var name = ‘global‘;
 5 foo(); // global
 6 var obj = {
 7     name: ‘block‘,
 8     foo: foo
 9 };
10 obj.foo(); // block

全局函数call和apply可以改变this的指向:

1 foo() {
2     console.log(this.name);
3 }
4 var name = ‘global‘;
5 var obj = {
6     name: ‘block‘
7 };
8 foo.apply(window); // global
9 foo.call(obj); // block

call和apply的唯一区别是,apply在传参数时,apply的参数要放在一个数组里,而call不需要。

 在javascript中,函数也是个对象:

 1 function foo() {
 2      if (this === window) {
 3         console.log(this is window);
 4     }
 5 }
 6 foo.boo= function() {
 7     if (this === window) {
 8         console.log(this is window);
 9     } else {
10         console.log(this is foo);   
11     }
12 }
13 // 等价于 window.foo
14 foo(); // this is window
15 
16 foo.boo(); // this is foo
17 
18 // 可以用call改变函数中this指向
19 foo.boo.call(window); // this is window

对象中的嵌套函数的this指向不是当前对象,而是window

 1 let name = ‘window‘;
 2 let obj = {
 3     name: ‘obj‘,
 4     getName: function() {
 5         console.log(this.name);
 6         return function() {
 7             console.log(this.name)
 8         }
 9     }
10 };
11 obj.getName()(); // obj   window     

解决上述问题的三种方法:

1、使用函数的bind方法,绑定当前this

 1 let name = ‘window‘;
 2 let obj = {
 3     name: ‘obj‘,
 4     getName: function() {
 5         console.log(this.name);
 6         return function() {
 7             console.log(this.name)
 8         }.bind(this);
 9      }
10  };
11 obj.getName()(); // obj   obj

2、使用变量将上面的this接收一下,然后下面不适用this,使用那个变量

3、使用ES6的箭头函数

 1 let name = ‘window‘;
 2 let obj = {
 3     name: ‘obj‘,
 4     getName: function() {
 5         console.log(this.name);
 6         return () => {
 7             console.log(this.name)
 8         }
 9     }
10 };
11 obj.getName()(); // obj   obj 

 


以上是关于this的指向问题及修改指向的主要内容,如果未能解决你的问题,请参考以下文章

setTimeout中所执行函数中的this,永远指向window

this的应用及指向问题

this指向及改变this指向的方法

this指向问题new的过程

JS中this指向问题相关知识点及解析

修改this指向(bindcall 和 apply)