摘要:作用域鏈作用域就近原則在寫下聲明就能確定的,叫做詞法作用域詞法作用域可以確定是哪個(gè),但不能確定的值關(guān)于作用域鏈,瀏覽器內(nèi)部究竟發(fā)生了什么例子聲明前置調(diào)用調(diào)用例子聲明前置調(diào)用調(diào)用例子聲明前置調(diào)用調(diào)用例子,,,,,,聲明前置調(diào)用調(diào)用調(diào)用
作用域鏈
作用域:就近原則
在寫下聲明就能確定的,叫做詞法作用域
var a = 1 function bar(){ var a = 2 console.log(a) //2 }
詞法作用域可以確定是哪個(gè)a,但不能確定a的值
var a function foo(){ var a = 1 bar() } function bar(){ console.log(a) //100 } a = 100 foo()
關(guān)于作用域鏈,瀏覽器內(nèi)部究竟發(fā)生了什么:
例子1:
var x = 10 bar() function foo() { console.log(x) //10 } function bar(){ var x = 30 foo() } 1. 聲明前置 globalContext = { AO:{ x:10, foo:function(){}, bar:function(){} }, Scope:null } foo.[[scope]] = globalContext.AO bar.[[scope]] = globalContext.AO 2. 調(diào)用 bar barContext = { AO:{ x:30 } Scope:bar.[[scope]] = globalContext.AO } 3. 調(diào)用 foo fooContext = { AO:{} Scope:foo.[[scope]] = globalContext.AO }
例子2:
var x = 10; bar() function bar(){ var x = 30; function foo(){ console.log(x) //30 } foo(); } 1. 聲明前置 globalContext = { AO:{ x:10 bar:function } Scope:null } bar.[[scope]] = globaleContext.AO 2. 調(diào)用 bar barContext = { AO:{ x:30 foo:function } Scope:bar.[[scope]] = globaleContext.AO } foo.[[scope]] = barContext.AO 3. 調(diào)用 foo fooContext = { AO:{} Scope:foo.[[scope]] = barContext.AO }
例子3:
var x = 10; bar() function bar(){ var x = 30; (function (){ console.log(x) //30 })() } 1. 聲明前置 globalContext = { AO:{ x:10 bar:function } Scope:null } bar.[[scope]] = globalContext.AO 2. 調(diào)用 bar barContext = { AO:{ x:30 function } Scope:bar.[[scope]] = globalContext.AO } function.[[scope]] = barContext.AO 3. 調(diào)用 function functionContext = { AO:{} Scope:function.[[scope]] = barContext.AO }
例子4:
var a = 1; function fn(){ console.log(a) //1,undefined var a = 5 console.log(a) //2,5 a++ var a fn3() fn2() console.log(a) //5,20 function fn2(){ console.log(a) //4,6 a = 20 } } function fn3(){ console.log(a) //3,1 a = 200 } fn() console.log(a) //6,200 1. 聲明前置 globalContext = { AO:{ a:200 fn:function fn3:function } Scope:null } fn.[[scope]] = globalContext.AO fn3.[[scope]] = globalContext.AO 2. 調(diào)用 fn fnContext = { AO:{ a:20 fn2:funcion } Scope:fn.[[scope]] = globalContext.AO } fn2.[[scope]] = fnContext.AO 3. 調(diào)用 fn3 fn3Context = { AO:{} Scope:fn3.[[scope]] = globalContext.AO } 4. 調(diào)用 fn2 fn2Context = { AO:{} Scope:fn2.[[scope]] = fnContext.AO }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/96671.html
摘要:示例當(dāng)一個(gè)函數(shù)創(chuàng)建后,它的作用域鏈會(huì)被創(chuàng)建此函數(shù)的作用域中可訪問的數(shù)據(jù)對(duì)象填充。每一個(gè)運(yùn)行期上下文都和一個(gè)作用域鏈關(guān)聯(lián)。此時(shí),作用域鏈中函數(shù)的所有局部變量所在的作用域?qū)ο髸?huì)被推后,訪問代價(jià)變高了。 作用域 作用域就是變量與函數(shù)的可訪問范圍,即作用域控制著變量與函數(shù)的可見性和生命周期。在JavaScript中,變量的作用域有全局作用域和局部作用域兩種。 作用域鏈 函數(shù)對(duì)象有一個(gè)內(nèi)部屬性[...
摘要:當(dāng)執(zhí)行流進(jìn)入一個(gè)函數(shù)時(shí),函數(shù)的環(huán)境就會(huì)被推入一個(gè)環(huán)境棧中。在函數(shù)執(zhí)行完后,棧將其環(huán)境彈出,把控制權(quán)返回給之前的執(zhí)行環(huán)境。執(zhí)行環(huán)境可以分為創(chuàng)建執(zhí)行銷毀三個(gè)階段。在這個(gè)階段,作用域鏈會(huì)被初始化,的值也會(huì)被最終確定。 執(zhí)行環(huán)境 執(zhí)行環(huán)境中定義了變量和函數(shù)有權(quán)訪問的其他數(shù)據(jù),決定了他們各自的行為。 當(dāng)JavaScript解釋器初始化執(zhí)行代碼時(shí),它首先默認(rèn)進(jìn)入全局執(zhí)行環(huán)境,從此刻開始,函數(shù)的每...
摘要:開篇作用域是每種計(jì)算機(jī)語(yǔ)言最重要的基礎(chǔ)之一,因此要想深入的學(xué)習(xí)作用域和作用域鏈就是個(gè)繞不開的話題。這樣由多個(gè)執(zhí)行上下文的變量對(duì)象構(gòu)成的鏈表就叫做作用域鏈。這時(shí)候執(zhí)行上下文的作用域鏈,我們命名為至此,作用域鏈創(chuàng)建完畢。 開篇 作用域是每種計(jì)算機(jī)語(yǔ)言最重要的基礎(chǔ)之一,因此要想深入的學(xué)習(xí)JavaScript,作用域和作用域鏈就是個(gè)繞不開的話題。 在《深入學(xué)習(xí)js之—-執(zhí)行上下文棧》中我們提到...
摘要:至此作用域鏈創(chuàng)建完畢。好了,通過深入理解作用域鏈,我們能跟好的理解的運(yùn)行機(jī)制和閉包的原理。 前言 理解javascript中的作用域和作用域鏈對(duì)我們理解js這們語(yǔ)言。這次想深入的聊下關(guān)于js執(zhí)行的內(nèi)部機(jī)制,主要討論下,作用域,作用域鏈,閉包的概念。為了更好的理解這些東西,我模擬了當(dāng)一個(gè)函數(shù)執(zhí)行時(shí),js引擎做了哪些事情--那些我們看不見的動(dòng)作。 關(guān)鍵詞: 執(zhí)行環(huán)境 作用域 作用域鏈 變...
摘要:每一個(gè)執(zhí)行上下文可以訪問的對(duì)象包括自身的作用域和父執(zhí)行上下文的作用域和父父執(zhí)行上下文作用域直到全局作用域,這就產(chǎn)生了作用域鏈。語(yǔ)句結(jié)束后,作用域鏈恢復(fù)正常。 0、自己理解 代碼執(zhí)行或函數(shù)調(diào)用生成執(zhí)行上下文(只有當(dāng)前執(zhí)行上下文有執(zhí)行權(quán)),該執(zhí)行上下文內(nèi)只能訪問當(dāng)前執(zhí)行上下文的變量、函數(shù)和上一級(jí)執(zhí)行上下文中的變量、函數(shù),激活下一個(gè)執(zhí)行上下文的時(shí)候執(zhí)行權(quán)轉(zhuǎn)移到新的執(zhí)行上下文,形成執(zhí)行上下文棧...
摘要:全局執(zhí)行環(huán)境的變量對(duì)象始終是作用域鏈中的最后一個(gè)變量對(duì)象。綜上,每個(gè)函數(shù)對(duì)應(yīng)一個(gè)執(zhí)行環(huán)境,每個(gè)執(zhí)行環(huán)境對(duì)應(yīng)一個(gè)變量對(duì)象,而多個(gè)變量對(duì)象構(gòu)成了作用域鏈,如果當(dāng)前執(zhí)行環(huán)境是函數(shù),那么其活動(dòng)對(duì)象在作用域鏈的前端。 1.幾個(gè)概念 先說幾個(gè)概念:函數(shù)、執(zhí)行環(huán)境、變量對(duì)象、作用域鏈、活動(dòng)對(duì)象。這幾個(gè)東東之間有什么關(guān)系呢,往下看~ 函數(shù) 函數(shù)大家都知道,我想說的是,js中,在函數(shù)內(nèi)部有兩個(gè)特殊...
閱讀 998·2023-04-26 02:21
閱讀 2818·2021-09-24 09:47
閱讀 1608·2019-08-30 15:55
閱讀 2164·2019-08-30 14:01
閱讀 2320·2019-08-29 14:01
閱讀 2048·2019-08-29 12:46
閱讀 815·2019-08-26 13:27
閱讀 1933·2019-08-26 12:23