super-fool / blog

珍藏经典, 分享思想, 共同进步.加油
3 stars 0 forks source link

this的四种指向 #74

Closed super-fool closed 3 years ago

super-fool commented 3 years ago

new

创建一个构造函数实例, 即全新的对象.

super-fool commented 3 years ago

箭头函数

function foo() {
  setTimeout(() => {
    console.log('id:', this.id)
  }, 100)
}

function bar() {
  setTimeout(function() {
    console.log('id:', this.id)
  }, 100)
}

var id = 21

foo.call({ id: 42 }) // id: 42
bar.call({ id: 42 }) // id: 21

setTimeout是一个微异步任务, 由全局上下文进行执行, 但是, 箭头函数的执行上下文是在代码定义时就已经确定, 所以foothis 指向是{id: 42}.

下一个🌰:

let foo = () => {
  let a = 111
  return {
    a: a,
    fn: () => {
      console.log(this) // window对象
      // 在某个环境中读取或写入而引用一个标识符时,必须通过搜索来确定该标识符实际代表是什么。
      // 若找到,搜索停止。若没有,则该变量未声明
      // fn中对变量a的赋值本质是,向上在作用域链中搜索,找到位于foo中的变量a,并在
      // fn中对foo的变量a进行赋值
      a = 222
    },
    num: () => {
      console.log(this) //  window对象
      console.log(a) // 222
    }
  }
}
let ins = foo()
ins.fn()
ins.num()
super-fool commented 3 years ago

node