鍍金池/ 問答/網(wǎng)絡(luò)安全  HTML/ 調(diào)用setTimeout()是通過閉包的作用域鏈還是函數(shù)對(duì)象的原型鏈?

調(diào)用setTimeout()是通過閉包的作用域鏈還是函數(shù)對(duì)象的原型鏈?

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

setTimeout是window的方法, 那么問題來了, 在閉包中調(diào)調(diào)用setTimeout()時(shí)屬于通過閉包的作用域鏈還是函數(shù)對(duì)象的原型鏈???

思考, 函數(shù)也是一個(gè)對(duì)象繼承自O(shè)bject,閉包的作用域鏈還是函數(shù)對(duì)象的尋找父級(jí)屬性還是, 慢著, 應(yīng)該是閉包的方式, Object對(duì)象沒有setTimeout方法。

clipboard.png

setTimeout的作用域是全局作用域。 請(qǐng)問看到問題的大神有什么要補(bǔ)充的么?

我又看到一句話作用域鏈和原型繼承有點(diǎn)相似,但又有點(diǎn)小差別:假設(shè)去查找一個(gè)普通對(duì)象的屬性時(shí),在當(dāng)前對(duì)象和其原型中都找不到時(shí),會(huì)返回undefined。但查找的屬性在作用域鏈中不存在的話就會(huì)拋出ReferenceError。

作用域鏈的頂端是全局對(duì)象。

clipboard.png

foobar沒有定義的確是原型鏈。

clipboard.png

定義了var foobar = "hello", 就能從作用域鏈中找到。

但是,

clipboard.png

我把foobar定在在全局對(duì)象中, 為什么會(huì)報(bào)錯(cuò)?

回答
編輯回答
青檸

其實(shí)setTimeout()這一句話是分兩個(gè)部分 查找和執(zhí)行
查找setTimeout方法 作用域鏈
在當(dāng)前作用域試圖找局部setTimeout,沒找到
然后往外層作用域找
直到找到全局 windowsetTimeout 然后調(diào)用

執(zhí)行setTimeout方法 原型鏈
window是否有直接屬性setTimeout,沒找到
然后往window.__proto__
一直順著原型鏈找直到null

2017年11月10日 22:53