在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

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

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

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

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

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

clipboard.png

setTimeout的作用域是全局作用域。 請問看到問題的大神有什么要補充的么?

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

作用域鏈的頂端是全局對象。

clipboard.png

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

clipboard.png

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

但是,

clipboard.png

我把foobar定在在全局對象中, 為什么會報錯?

回答
編輯回答
青檸

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

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

2017年11月10日 22:53