this 指向小解

35 阅读1分钟

当我们在JavaScript中书写代码时,this的指向是非常重要的,它的值会影响代码的执行结果。下面我们通过一些具体的案例来详细讲解this指向问题:

  1. 全局环境中的this

在全局环境中,this指向全局对象。例如:

console.log(this); // 输出全局对象,在浏览器中为window,在Node.js中为global
  1. 函数内部的this

在函数内部,this的值取决于函数的调用方式。如果函数被作为普通函数调用,则this指向全局对象;如果函数被作为对象的方法调用,则this指向该对象。例如:

function foo() {
  console.log(this);
}

foo(); // 输出全局对象,在浏览器中为window,在Node.js中为global

var obj = {
  name: 'Jack',
  sayName: function() {
    console.log(this.name);
  }
}

obj.sayName(); // 输出'Jack'
  1. 构造函数中的this

在构造函数中,this指向新创建的实例对象。例如:

function Person(name) {
  this.name = name;
  this.sayName = function() {
    console.log(this.name);
  }
}

var jack = new Person('Jack');
jack.sayName(); // 输出'Jack'
  1. applycall方法中的this

applycall方法可以用来改变函数内部的this指向。apply方法将this绑定到一个对象上,并调用函数;call方法也是将this绑定到一个对象上,并调用函数,但是参数的传递方式有所不同。例如:

function sayName() {
  console.log(this.name);
}

var obj1 = {
  name: 'Jack'
}

var obj2 = {
  name: 'Tom'
}

sayName.apply(obj1); // 输出'Jack'
sayName.call(obj2); // 输出'Tom'
  1. 箭头函数中的this

箭头函数没有自己的this,它的this指向是在定义时就确定的,指向外层作用域中的this。例如:

var obj = {
  name: 'Jack',
  sayName: function() {
    var arrowFunc = () => {
      console.log(this.name);
    }
    arrowFunc();
  }
}

obj.sayName(); // 输出'Jack'

总之,理解this指向问题是JavaScript编程中非常重要的一部分,需要根据具体情况灵活运用。