成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Javascript中的作用域與閉包

tianren124 / 1288人閱讀

摘要:作用域分為詞法作用域和動(dòng)態(tài)作用域。這樣就形成了一個(gè)鏈?zhǔn)降淖饔糜?。一般情況下,當(dāng)函數(shù)執(zhí)行完畢時(shí),里面的變量會(huì)被自動(dòng)銷毀。而能夠訪問(wèn)到這個(gè)在的編譯階段就已經(jīng)定型了詞法作用域。

什么是作用域?
在當(dāng)前運(yùn)行環(huán)境下,可以訪問(wèn)的變量或函數(shù)的范圍。
作用域分為詞法作用域動(dòng)態(tài)作用域。
詞法作用域是在js代碼編譯階段就確定下來(lái)的; 對(duì)應(yīng)的,witheval語(yǔ)句會(huì)產(chǎn)生動(dòng)態(tài)作用域。

會(huì)產(chǎn)生新的作用域的情況:

函數(shù)

{}(ES6)

eval

舉個(gè)例子說(shuō)明作用域

var a = "hello";
function f1(){
    var a = 1;
    console.log(a);
}
f1();  // 1
console.log(a); // hello

可以看到f1中的變量a只能在f1中有效,f1外部訪問(wèn)不到里面的a;所以在f1中的a,其作用域就只限定在f1中。

再來(lái)個(gè)新概念:作用域鏈

var a = "hello";
function f1(){
    console.log(a);// ps: f1中并未聲明a
}
f1(); // hello

之所以輸出hello, 是因?yàn)樵趂1中并未找到a的定義,此時(shí)程序并不會(huì)急于拋異常,而是會(huì)向調(diào)用f1的上一層尋找a的定義。如果沒(méi)有,會(huì)繼續(xù)再往上一層的上一層尋找,直到最頂層。
這樣就形成了一個(gè)鏈?zhǔn)降淖饔糜颉?/p>

什么是閉包?

通常來(lái)講,函數(shù)可以訪問(wèn)函數(shù)外面的變量;但是在函數(shù)外部,訪問(wèn)不到在函數(shù)里面定義的變量。

function f1(){
    var a = 1;
}
console.log(a);  // Uncaught ReferenceError: a is not defined

那么有沒(méi)有可能訪問(wèn)到f1中的a呢?當(dāng)然是有的, 看例子:

function f1(){
    var a = 1;
    function f2(){
        return a;
    }
    return f2;
}
var getA = f1();
console.log(getA()); // 1

我們?cè)趂1中,添加了一個(gè)函數(shù)f2(實(shí)際上f2就可以看做一個(gè)閉包)。
一般情況下,當(dāng)函數(shù)執(zhí)行完畢時(shí),里面的變量會(huì)被自動(dòng)銷毀。但是因?yàn)槲覀儼裦2賦值給了外部的getA,所以f2不會(huì)被內(nèi)存釋放,同理f2中使用的a在f2的作用域中,也不會(huì)被釋放,所以這個(gè)時(shí)候就可以訪問(wèn)到a。
而getA能夠訪問(wèn)到a,這個(gè)在js的編譯階段就已經(jīng)定型了(詞法作用域)。

官方”的解釋是:閉包是一個(gè)擁有許多變量和綁定了這些變量的環(huán)境的表達(dá)式(通常是一個(gè)函數(shù)),因而這些變量也是該表達(dá)式的一部分。
相信很少有人能直接看懂這句話,因?yàn)樗枋龅奶珜W(xué)術(shù)。其實(shí)這句話通俗的來(lái)說(shuō)就是:閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。

閉包的特點(diǎn)
閉包可以在函數(shù)外部改變函數(shù)中的變量的值,如果你把函數(shù)作為對(duì)象、閉包作為方法、局部變量作為私有屬性使用,則會(huì)改變?cè)撟兞康闹?;閉包還會(huì)把函數(shù)中的變量的值存儲(chǔ)于內(nèi)存中,對(duì)內(nèi)存消耗很大,所以濫用閉包的結(jié)果就是影響網(wǎng)頁(yè)性能,IE中則可能導(dǎo)致內(nèi)存泄露

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/110162.html

相關(guān)文章

  • 你不知道的JavaScript上卷之作用域與閉包·讀書(shū)筆記

    摘要:的分句會(huì)創(chuàng)建一個(gè)塊作用域,其聲明的變量?jī)H在中有效。而閉包的神奇作用是阻止此事發(fā)生。依然持有對(duì)該作用域的引用,而這個(gè)引用就叫做閉包。當(dāng)然,無(wú)論使用何種方式對(duì)函數(shù)類型的值進(jìn)行傳遞,當(dāng)函數(shù)在別處被調(diào)用時(shí)都可以觀察到閉包。 date: 16.12.8 Thursday 第一章 作用域是什么 LHS:賦值操作的目標(biāo)是誰(shuí)? 比如: a = 2; RHS:誰(shuí)是賦值操作的源頭? 比如: conso...

    Raaabbit 評(píng)論0 收藏0
  • 《你不知道的javascript》筆記_作用域與閉包

    摘要:建筑的頂層代表全局作用域。實(shí)際的塊級(jí)作用域遠(yuǎn)不止如此塊級(jí)作用域函數(shù)作用域早期盛行的立即執(zhí)行函數(shù)就是為了形成塊級(jí)作用域,不污染全局。這便是閉包的特點(diǎn)吧經(jīng)典面試題下面的代碼輸出內(nèi)容答案?jìng)€(gè)如何處理能夠輸出閉包方式方式下一篇你不知道的筆記 下一篇:《你不知道的javascript》筆記_this 寫(xiě)在前面 這一系列的筆記是在《javascript高級(jí)程序設(shè)計(jì)》讀書(shū)筆記系列的升華版本,旨在將零碎...

    galaxy_robot 評(píng)論0 收藏0
  • Javascript重溫OOP之作用域與閉包

    摘要:的變量作用域是基于其特有的作用域鏈的。需要注意的是,用創(chuàng)建的函數(shù),其作用域指向全局作用域。所以,有另一種說(shuō)法認(rèn)為閉包是由函數(shù)和與其相關(guān)的引用環(huán)境組合而成的實(shí)體。 作用域 定義 在編程語(yǔ)言中,作用域控制著變量與參數(shù)的可見(jiàn)性及生命周期,它能減少名稱沖突,而且提供了自動(dòng)內(nèi)存管理 --javascript 語(yǔ)言精粹 我理解的是,一個(gè)變量、函數(shù)或者成員可以在代碼中訪問(wèn)到的范圍。 js的變量作...

    JessYanCoding 評(píng)論0 收藏0
  • 先有蛋還是先有雞?JavaScript 作用域與閉包探析

    摘要:而閉包的神奇之處正是可以阻止事情的發(fā)生。拜所聲明的位置所賜,它擁有涵蓋內(nèi)部作用域的閉包,使得該作用域能夠一直存活,以供在之后任何時(shí)間進(jìn)行引用。依然持有對(duì)該作用域的引用,而這個(gè)引用就叫閉包。 引子 先看一個(gè)問(wèn)題,下面兩個(gè)代碼片段會(huì)輸出什么? // Snippet 1 a = 2; var a; console.log(a); // Snippet 2 console.log(a); v...

    elisa.yang 評(píng)論0 收藏0
  • 夯實(shí)基礎(chǔ)-作用域與閉包

    摘要:作用域分類作用域共有兩種主要的工作模型。換句話說(shuō),作用域鏈?zhǔn)腔谡{(diào)用棧的,而不是代碼中的作用域嵌套。詞法作用域詞法作用域中,又可分為全局作用域,函數(shù)作用域和塊級(jí)作用域。 一篇鞏固基礎(chǔ)的文章,也可能是一系列的文章,梳理知識(shí)的遺漏點(diǎn),同時(shí)也探究很多理所當(dāng)然的事情背后的原理。 為什么探究基礎(chǔ)?因?yàn)槟悴蝗ッ嬖嚹憔筒恢阑A(chǔ)有多重要,或者是說(shuō)當(dāng)你的工作經(jīng)歷沒(méi)有亮點(diǎn)的時(shí)候,基礎(chǔ)就是檢驗(yàn)?zāi)愫脡牡囊豁?xiàng)...

    daydream 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<