Closed super-fool closed 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
是一个微异步任务, 由全局上下文进行执行, 但是, 箭头函数的执行上下文是在代码定义时就已经确定, 所以foo
的this
指向是{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()
node
new
创建一个构造函数实例, 即全新的对象.