相信很多人都能正確地訪問屬性和訪問變量,但對于一些特性的問題(如本文中的第2部分< 未定義的變量與未定義的屬性的訪問 >)可能就不知其所以然了汪诉,造成這種情況的原因就是:對于這些知識,只是會用爽冕,但不理解拭卿;
為了幫助大家深入理解JavaScript中標(biāo)識符查找過程,現(xiàn)給出規(guī)則和應(yīng)用示例如下:(若想更深入地理解JavaScript的各種特性癌瘾,可以參考另一篇文章:《JavaScript的發(fā)現(xiàn)與理解》)
1.標(biāo)識符查找
- 訪問屬性,查找的是原型鏈饵溅;
- 訪問變量妨退,查找的是作用域鏈;
作用鏈?zhǔn)且粋€棧蜕企,棧里保存的是作用域?qū)ο笠Ш桑瑮5淖铐敹耸钱?dāng)前作用域?qū)ο螅瑮5淖畹锥耸侨肿饔糜驅(qū)ο螅?br> 作用域?qū)ο笾挥?種:
- 全局作用域?qū)ο螅?/li>
- 函數(shù)作用域?qū)ο螅?/li>
所以當(dāng)通過屬性調(diào)用的方式調(diào)用對象的方法時轻掩,該對象只會成this的值幸乒;不會成為它的方法(即:對象中屬性值是函數(shù)的屬性)的作用域鏈中的作用域?qū)ο螅贿^可以通過with操作符使對象成為它的方法的作用域鏈中的作用域?qū)ο螅?/p>
2. 未定義的變量與未定義的屬性的訪問
假設(shè)以下代碼在全局作用域下執(zhí)行唇牧,且gby和dyx都從未定義過罕扎,則執(zhí)行結(jié)果如下:
gby; //結(jié)果:報(bào)錯:ReferenceError: Can't find variable: gby聚唐;
window.gby; //結(jié)果:undefined
window.dyx; //結(jié)果:undefined
所以:訪問未定義的變量會報(bào)錯,但訪問未定義的屬性不會報(bào)錯腔召,只是結(jié)果為undefined杆查;
如果gby是全局變量,則gby 和 window.gby 訪問的都是同一個變量臀蛛,那為什么這兩種訪問方式的結(jié)果不一樣呢亲桦?我認(rèn)為原因如下:
訪問變量時是通過搜索作用域鏈來查找變量的,而訪問屬性是通過搜索原型鏈來查找屬性的浊仆,因?yàn)檫@兩種訪問方式的搜索方式不一樣客峭,所以導(dǎo)致了結(jié)果不一樣;