(function () {
return function () {
setTimeout(function () {
console.log("hello")
}, 1000)
}()
})()
setTimeout是window的方法, 那么问题来了, 在闭包中调调用setTimeout()时属于通过闭包的作用域链还是函数对象的原型链???
思考, 函数也是一个对象继承自Object,闭包的作用域链还是函数对象的寻找父级属性还是, 慢着, 应该是闭包的方式, Object对象没有setTimeout方法。
setTimeout的作用域是全局作用域。 请问看到问题的大神有什么要补充的么?
我又看到一句话作用域链和原型继承有点相似,但又有点小差别:假设去查找一个普通对象的属性时,在当前对象和其原型中都找不到时,会返回undefined。但查找的属性在作用域链中不存在的话就会抛出ReferenceError。
作用域链的顶端是全局对象。
foobar没有定义的确是原型链。
定义了var foobar = "hello", 就能从作用域链中找到。
但是,
我把foobar定在在全局对象中, 为什么会报错?
其实
setTimeout()这一句话是分两个部分 查找和执行查找
setTimeout方法 作用域链在当前作用域试图找局部
setTimeout,没找到然后往外层作用域找
直到找到全局
window的setTimeout然后调用执行
setTimeout方法 原型链找
window是否有直接属性setTimeout,没找到然后往
window.__proto__找一直顺着原型链找直到
null