调用setTimeout()是通过闭包的作用域链还是函数对象的原型链?

(function () {
    return function () {
        setTimeout(function () {
            console.log("hello")
        }, 1000)
    }()
})()

setTimeout是window的方法, 那么问题来了, 在闭包中调调用setTimeout()时属于通过闭包的作用域链还是函数对象的原型链???

思考, 函数也是一个对象继承自Object,闭包的作用域链还是函数对象的寻找父级属性还是, 慢着, 应该是闭包的方式, Object对象没有setTimeout方法。

clipboard.png

setTimeout的作用域是全局作用域。 请问看到问题的大神有什么要补充的么?

我又看到一句话作用域链和原型继承有点相似,但又有点小差别:假设去查找一个普通对象的属性时,在当前对象和其原型中都找不到时,会返回undefined。但查找的属性在作用域链中不存在的话就会抛出ReferenceError。

作用域链的顶端是全局对象。

clipboard.png

foobar没有定义的确是原型链。

clipboard.png

定义了var foobar = "hello", 就能从作用域链中找到。

但是,

clipboard.png

我把foobar定在在全局对象中, 为什么会报错?

阅读 2.9k
1 个回答

其实setTimeout()这一句话是分两个部分 查找和执行
查找setTimeout方法 作用域链
在当前作用域试图找局部setTimeout,没找到
然后往外层作用域找
直到找到全局 windowsetTimeout 然后调用

执行setTimeout方法 原型链
window是否有直接属性setTimeout,没找到
然后往window.__proto__
一直顺着原型链找直到null

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题