javascript
js cookies 存数组_用一个例子理解JS函数的底层处理机制
以下面代碼的運行舉例,一行行進行運行的解析
var x = [12, 23]; function fn(y) {y[0] = 100;y = [100];y[1] = 200;console.log(y); } fn(x); console.log(x);var x = [12, 23];運行如下
接著
function fn(y) {y[0] = 100;y = [100];y[1] = 200;console.log(y); }運行如下
上面這段代碼是創(chuàng)建一個函數(shù)的過程。和創(chuàng)建一個變量類似:
- 都是聲明一個變量存儲值
- 步驟一樣:第一步也是先創(chuàng)建一個堆內(nèi)存,里面存的是函數(shù),這個堆內(nèi)存有一個地址,然后把地址賦值給變量
- 聲明:方式類似函數(shù)名也算變量,當我們聲明函數(shù)function fn(y){...}時,相當于我們聲明了一個變量,只不過值是函數(shù)。類似于var fn = function (y){...}的函數(shù)表達式。最終把一個函數(shù)作為值賦值給一個變量或者其他
所以創(chuàng)建一個函數(shù),詳細的執(zhí)行順序如下 1. 首先開辟一個堆內(nèi)存,存儲函數(shù)的值(假設地址為0x000001) - 對象的值在堆內(nèi)存當中,存儲的是它的鍵值對 - 函數(shù)的值在堆內(nèi)存當中,存儲的是它的代碼,而且是以字符串的形式存儲的 - 創(chuàng)建函數(shù)的時候,就聲明了它的作用域(scope),scope值是當前創(chuàng)建函數(shù)的時候所處的上下文,即在哪個上下文中創(chuàng)建的,作用域就是誰
2. 接著聲明變量fn,并且指向堆內(nèi)存地址(假設為0x000001)
函數(shù)執(zhí)行的步驟
fn(x);運行如下(函數(shù)執(zhí)行的步驟)
- 初始化作用域鏈scope-chain ,鏈的兩頭是 <當前自己的私有上下文,函數(shù)的作用域(創(chuàng)建函數(shù)的時候所在的上下文)>,鏈的右側(cè)也叫當前上下文的'上級上下文'
- 初始化this
- 初始化argument
- 在當前上下文中,聲明一個形參變量,并且把傳遞的實參值賦值給它
- 變量提升
函數(shù)進棧執(zhí)行代碼的詳細步驟
接著說說上面第5步的詳細步驟
把之前創(chuàng)建的函數(shù),在堆內(nèi)存中存儲的代碼字符串拿出來轉(zhuǎn)換為代碼一行一行的執(zhí)行執(zhí)行。
私有上下文中代碼執(zhí)行中如果遇到一個變量,首先看是否為自己的'私有變量',如果是'私有'的,則操作自己的,和外界沒有必然的關(guān)系,如果不是自己私有的,則基于作用域鏈,向其上級上下文中查找,看是否為上級上下文中私有的,如果也不是,繼續(xù)向上查找......一直找到EC(G)全局上下文為止,我們把這種查找過程稱之為 作用域鏈查找機制 所以
y[0] = 100 y = [100] y[1] = 200是這樣的執(zhí)行的:
2. y = [100],出現(xiàn)了新的對象值,所以要開辟新的堆內(nèi)存0x000002,創(chuàng)建值,賦值
3. y[1] = 200,將0x000002地址對應的對象的值進行修改
4. console.log(y);這個y就是0x000002對應的值[100,200]操作的是私有變量y
fn函數(shù)至此執(zhí)行完畢。
接著執(zhí)行外面的console.log(x);,此時的x為全局變量對象中的x,對應的地址為0x000000,所以直接進行輸出[100,23]
如果fn執(zhí)行完之后,繼續(xù)執(zhí)行其他函數(shù),同樣會經(jīng)歷這樣的流程。形成新的上下文,進棧執(zhí)行...如果函數(shù)非常多,會一直進棧,占內(nèi)存會越來越大。所以為了優(yōu)化,瀏覽器會默認做出很多回收機制
結(jié)果與總體流程
結(jié)果
總體流程圖
其他說明點
js上下文分類
js上下文(哪一個區(qū)域下執(zhí)行)分類
- 全局上下文EC(G)
- 函數(shù)執(zhí)行形成的私有上下文
- 塊級私有上下文
什么是私有變量
私有變量是私有上下文聲明的變量,包含
總結(jié)
以上是生活随笔為你收集整理的js cookies 存数组_用一个例子理解JS函数的底层处理机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: a律13折线pcm编码例题_a律13折线
- 下一篇: nexus 代理阿里云_Azure容器镜