摘要:一直以來的原型鏈和作用域鏈非常困擾我,其中夾雜著問題更是讓問題雪上加霜,并不是說原型鏈或者說作用域鏈有多難理解,而是經(jīng)常混亂了概念,下面記錄一下思考過程,希望對自己或是他人都有幫助。
一直以來JavaScript的原型鏈和作用域鏈非常困擾我,其中夾雜著this問題更是讓問題雪上加霜,并不是說原型鏈或者說作用域鏈有多難理解,而是經(jīng)常混亂了概念,下面記錄一下思考過程,希望對自己或是他人都有幫助。
var maybe="maybe" function ObjectMake (){ var maybe = "hello"; this.getmaybe = function(){ return maybe; } } var b = new ObjectMake(); var c = b.getmaybe(); //hello
作用域(scope)是針對函數(shù)而言的,每個函數(shù)在執(zhí)行的時候都會分配作用域鏈,上面例子是一個典型的工廠模式,其中對于ObjectMake函數(shù)而言,其作用域鏈[[scope]]是scope_0(Windows)+scope_1(ObjectMake),對于getmaybe函數(shù)而言,其作用域是scope_0(Windows)+scope_1(ObjectMake)+scope_2(getmaybe),在scope0和scope1都存在maybe變量的時候,scope1優(yōu)先于scope0,所以變量c的值是hello。
下面這種情況呢:
var maybe="maybe"; var getmaybe = function(){ return maybe; } function ObjectMake (){ var maybe = "hello"; this.getmaybe = getmaybe; } var b = new ObjectMake(); var c = b.getmaybe(); //maybe 根據(jù)作用域鏈分析可以得出:對于getmaybe函數(shù)而言,其作用域鏈[[scope]]是scope_0(Windows)+scope_1(getmaybe),對于對于ObjectMake函數(shù)而言,其作用域鏈[[scope]]是scope_0(Windows)+scope_1(ObjectMake),所以當(dāng)運行b.getmaybe時getmaybe查找作用域只能在cope_0(Windows)中發(fā)現(xiàn)maybe變量,故c的值為maybe。 有人可能會提出一個問題,為什么getmaybe函數(shù)作用域鏈沒有包含scope_1(ObjectMake),因為JavaScript是詞法作用域,簡而言之,就是函數(shù)的作用域鏈只和函數(shù)在哪里定義有關(guān)系,和函數(shù)在哪里運行沒有關(guān)系,上面getmaybe定義在Windows中,所以其作用域鏈中只存在兩個:Windows和它自己。 明白了這個道理,下面這個例子又讓我暈了很久: var maybe = "maybe"; var show = { maybe:"hello", getmaybe:function(){ return maybe; } } var d = show.getmaybe();//maybe 按照之前的說法,getmaybe定義在對象show對象當(dāng)中,為何d的值不是maybe?讓我們還是從之前的分析作用域鏈開始,函數(shù)getmaybe定義在對象show中,其作用域鏈為:scope_0(Windows)+scope_(getmaybe),scope作用域代表獲取執(zhí)行環(huán)境的地址,目前JavaScript的執(zhí)行環(huán)境有:1)全局執(zhí)行環(huán)境、2)Eval函數(shù)執(zhí)行環(huán)境、3)普通函數(shù)執(zhí)行環(huán)境,可知show對象不是一個執(zhí)行環(huán)境,函數(shù)的scope無法將它推入作用域鏈中,所以d的值為maybe。 下面我們再看一個例子: var maybe = "maybe"; var show = { maybe:"hello", getmaybe:function(){ return this.maybe; } } var d = show.getmaybe();//hello 上面在getmaybe函數(shù)中加上this指針后,終于返回了hello了,this指針在JavaScript中是一個非常重要但是又常常會誤導(dǎo)人的概念,在一般的OOP(面向?qū)ο蟮恼Z言中),一般都有this這個概念,比如c++的this,Python的self等等。this代表對象實例的地址,在JavaScript中,對象都是實例,不存在C++中的class概念,而this都是動態(tài)綁定的(可以用apply()或是call()等函數(shù)來改變),show.getmaybe()將getmaybe函數(shù)的this指針綁定了show對象,有些時候this指針會被偷偷的替換掉,這個時候可能我們都不知道,關(guān)于this指針,下次有時間再寫一篇作為理解之用。 這篇文章主要是關(guān)于JavaScript對象和作用域的關(guān)系,但實際上通過上面的例子可以知道,它們并沒有關(guān)系,都是個人見解,有誤后續(xù)會修改。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/86564.html
摘要:示例當(dāng)一個函數(shù)創(chuàng)建后,它的作用域鏈會被創(chuàng)建此函數(shù)的作用域中可訪問的數(shù)據(jù)對象填充。每一個運行期上下文都和一個作用域鏈關(guān)聯(lián)。此時,作用域鏈中函數(shù)的所有局部變量所在的作用域?qū)ο髸煌坪螅L問代價變高了。 作用域 作用域就是變量與函數(shù)的可訪問范圍,即作用域控制著變量與函數(shù)的可見性和生命周期。在JavaScript中,變量的作用域有全局作用域和局部作用域兩種。 作用域鏈 函數(shù)對象有一個內(nèi)部屬性[...
摘要:所以,全局執(zhí)行環(huán)境的變量對象始終都是作用域鏈中的最后一個對象。講到這里,可能你已經(jīng)對執(zhí)行環(huán)境執(zhí)行環(huán)境對象變量對象作用域作用域鏈的理解已經(jīng)他們之間的關(guān)系有了一個較清晰的認(rèn)識。 JavaScript中的執(zhí)行環(huán)境、作用域、作用域鏈、閉包一直是一個非常有意思的話題,很多博主和大神都分享過相關(guān)的文章。這些知識點不僅比較抽象,不易理解,更重要的是與這些知識點相關(guān)的問題在面試中高頻出現(xiàn)。之前我也看過...
摘要:每一個運行期上下文都和一個作用域鏈關(guān)聯(lián)。這個對象將被推入作用域鏈的頭部,這意味著函數(shù)的所有局部變量現(xiàn)在處于第二個作用域鏈對象中,因此訪問代價更高了。在代碼塊內(nèi)部,函數(shù)的所有局部變量將會被放在第二個作用域鏈對象中。 參考: Javascript作用域原理 理解 JavaScript 作用域和作用域鏈 JavaScript 作用域 作用域就是變量與函數(shù)的可訪問范圍,即作用域控制著變量與函數(shù)...
摘要:作用域與作用域鏈每個函數(shù)都有自己的執(zhí)行環(huán)境。這是初步了解作用域,如想更深入了解作用域,請看下面鏈接作用域原理作用域鏈由一道題圖解的作用域或者看權(quán)威指南和高級程序設(shè)計 本文是我學(xué)習(xí)JavaScript作用域整理的筆記,如有不對,請多指出。 作用域 一個變量的作用域是程序源代碼中定義這個變量的區(qū)域。 而在ES5中只分為全局作用域和函數(shù)作用域,也就是說for,if,while等語句是不會創(chuàng)建...
摘要:當(dāng)函數(shù)被調(diào)用的時候,作用域鏈就會包含多個作用域?qū)ο蟆5钱?dāng)函數(shù)要訪問時,并沒有找到,于是沿著作用域鏈向上查找,在的作用域找到了對應(yīng)的標(biāo)示符,就會修改的值。 JS JavaScript閉包和作用域 閉包 JavaScript高級程序設(shè)計中對閉包的定義:閉包是指有權(quán)訪問另外一個函數(shù)作用域中變量的函數(shù)。 從概念上,閉包有兩個特點: 函數(shù) 能訪問另外一個函數(shù)的作用域中的變量 在ES6之前,...
摘要:變量對象也是有父作用域的。作用域鏈的頂端是全局對象。當(dāng)函數(shù)被調(diào)用的時候,作用域鏈就會包含多個作用域?qū)ο蟆.?dāng)函數(shù)要訪問時,沒有找到,于是沿著作用域鏈向上查找,在的作用域找到了對應(yīng)的標(biāo)示符,就會修改的值。 一、概要 對于閉包的定義(紅寶書P178):閉包就是指有權(quán)訪問另外一個函數(shù)的作用域中的變量的函數(shù)。 關(guān)鍵點: 1、閉包是一個函數(shù) 2、能夠訪問另外一個函數(shù)作用域中的變量 二、閉包特性 對...
閱讀 3699·2021-10-13 09:40
閱讀 3161·2021-10-09 09:53
閱讀 3559·2021-09-26 09:46
閱讀 1860·2021-09-08 09:36
閱讀 4254·2021-09-02 09:46
閱讀 1323·2019-08-30 15:54
閱讀 3188·2019-08-30 15:44
閱讀 1031·2019-08-30 11:06