JS 中 this 详解 1(面试篇)

2,107 阅读3分钟

this是什么?

如果学过面向对象编程语言(比如 C#,Java,C++),那请将你对 this 这个关键词应该是做什么用的先入为主的概念扔到垃圾桶里,JavaScript 的 this 关键词是很不一样,因为 JavaScript 本来就不是一门基于类的面向对象编程语言.

虽然说 ES6 里面 JavaScript 给我们提供了类这个特性给我们用,但它只是一个语法糖,一个基于原型继承的语法糖!!!!

this 既不指向函数自身,也不指函数的词法作用域。如果仅通过this的英文解释,太容易产生误导了。它实际是在函数被调用时才发生的绑定,也就是说this具体指向什么,取决于你是怎么调用的函数.

javaScript this 关键词指的是它所属的对象。

它拥有不同的值,具体取决于它的使用位置:

  1. 在方法中,this 指的是所有者对象。
  2. 单独的情况下,this 指的是全局对象。
  3. 在函数中,this 指的是全局对象。
  4. 在函数中,严格模式下,this 是 undefined。
  5. 在事件中,this 指的是接收事件的元素。
  6. 箭头函数的this是在定义函数时绑定的,不是在执行过程中绑定的
  7. 像 call() 和 apply() 这样的方法可以将 this 引用到任何对象。

1. 方法中的 this

在对象方法中,this 指的是此方法的“拥有者”。 在下面例子中,this 指的是 person 对象。 person 对象是 fullName 方法的拥有者。

 var person = {
  firstName: "Tony",
  lastName : "ji"
  fullName : function() {
    return this.firstName + " " + this.lastName;
  }
};

2. 单独的this

在单独使用时,拥有者是全局对象,因此 this 指的是全局对象。

在浏览器窗口中,全局对象是 [object Window]

var tony = this;

3. 函数中的 this(默认)

在 JavaScript 函数中,函数的拥有者默认绑定 this。

因此,在函数中,this 指的是全局对象 [object Window]

function myFunction() {
  return this;
}

4. 函数中的 this(严格模式)

JavaScript 严格模式不允许默认绑定。

因此,在函数中使用时,在严格模式下,this 是未定义的(undefined)。

"use strict";
function myFunction() {
  return this;
}

5. 事件处理程序中的 this

在 HTML 事件处理程序中,this 指的是接收此事件的 HTML 元素

<button onclick="this.style.display='none'">
  点击!
</button>

6. 箭头函数的this定义

箭头函数的this是在定义函数时绑定的,不是在执行过程中绑定的。简单的说,函数在定义时,this就继承了定义函数的对象。所以,这会很好的解决匿名函数和setTimeout和setInterval的this指向问题。我们不用再去给其用that变量存储this。

打印的结果:

这就是箭头函数中的this

7. 改变this的指向

call()

第一个参数:this指向

如果要传参,后面依次是参数

        function fn(x,y){
            console.log(this);  
        }
        var obj = {
            name:"zs"
        }
        fn(1,2);
        fn.call(obj,1,2);

apply()

与第一种方法不同的是,用数组的形式表示参数

        function fn(x,y){
            console.log(this);  
        }
        var obj = {
            name:"zs"
        }
        fn(1,2);
        fn.apply(obj,[1,2]);

bind()

bind 只改变this指向 需要手动调用才可执行 ! ! !

        function fn(x,y){
            console.log(this);  
        }
        var obj = {
            name:"zs"
        }
        fn(1,2);
        fn.bind(obj,1,2)();