JavaScript中this指向和作用域

69 阅读2分钟

普通函数this

  • 普通函数this要看在哪执行的,怎么执行的。

箭头函数this

  • 箭头函数中this指向要看函数定义时所在的对象,this指向当前环境的上下文。

call, apply, bind

  • 三者都可以修改函数的this指向

  • callapply都是调用后立即执行bind则是不立即执行

  • call和apply传入的第二个参数不同,call只能接收单个参数,apply第二个参数必须为数组。

全局作用域

非严格模式和严格模式中this都是指向顶层对象(浏览器中是window)。

函数作用域

作用域属性是在定义函数的时候决定的,不是在调用函数的时候决定。

JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里。

例如:

var a = 100;
var fn1 = function () {
  var a = 200;
  return function () {
    console.log(a);
  }
}
var fn2 = fn1();
fn2();  // 200
var a = 100;
var fn1 = function (fn) {
  var a = 200;
  fn();
}
var fn = function() {
  console.log(a)
}
fn1(fn);  // 100
var a = 100;
var fn1 = function () {
  var a = 200;
  var fn = function() {
    console.log(a)
  }
  fn();
}
fn1();  // 200

总结

  • 在函数体中,非显式或隐式地简单调用函数时,在严格模式下,函数内的 this 会被绑定到 undefined 上,在非严格模式下则会被绑定到全局对象 window/global 上。

  • 一般使用 new 方法调用构造函数时,构造函数内的 this 会被绑定到新创建的对象上。

  • 一般通过 call/apply/bind 方法显示调用函数时,函数体内的 this 会被绑定到指定参数的对象上。

  • 一般通过上下文对象调用函数时,函数体内的 this 会被绑定到该对象上。

  • 在箭头函数中,this 的指向是由外层(函数或全局)作用域来决定的。

参考文章

JS 中 this 指向问题

this、apply、call、bind