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

資訊專欄INFORMATION COLUMN

理解javaScript變量、作用域鏈

KevinYan / 3188人閱讀

摘要:作用域鏈的用途,是保證對(duì)執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。當(dāng)前的執(zhí)行環(huán)境就是作用域的最前端,標(biāo)識(shí)符解析是沿著作用域鏈最前端向后回溯,直到找到標(biāo)志符當(dāng)某個(gè)函數(shù)被調(diào)用時(shí),會(huì)創(chuàng)建一個(gè)執(zhí)行環(huán)境及相應(yīng)的作用域鏈。

變量
由于JavaScript變量松散類型的本質(zhì),決定了它只是在特定時(shí)間用于保存特定值的一個(gè)名字而已。變量分為基礎(chǔ)類型值引用類型值;
基本類型值指的是簡單的數(shù)據(jù)段(Undefined、Null、Boolean、Number、String 和 symbol),而引用類型值指那些可能由多個(gè)值構(gòu)成的對(duì)象。

引用類型的值是保存在內(nèi)存中的對(duì)象。與其他語言不同,JavaScript 不允許直接訪問內(nèi)存中的位置, 也就是說不能直接操作對(duì)象的內(nèi)存空間。在操作對(duì)象時(shí),實(shí)際上是在操作對(duì)象的引用而不是實(shí)際的對(duì)象。 為此,引用類型的值是按引用訪問的
var obj1 = new Object();

var obj2 = obj1;
obj1.name = "Nicholas";
alert(obj2.name);  //"Nicholas"

作用域鏈
1.執(zhí)行環(huán)境
執(zhí)行環(huán)境(execution context,為簡單起見,有時(shí)也稱為“環(huán)境”)定義了變量或函數(shù)有權(quán)訪問的其他數(shù)據(jù),決定了它們各自的行為。
每個(gè)函數(shù)都有自己的執(zhí)行環(huán)境。當(dāng)執(zhí)行流進(jìn)入一個(gè)函數(shù)時(shí),函數(shù)的環(huán)境就會(huì)被推入一個(gè)環(huán)境棧中。 而在函數(shù)執(zhí)行之后,棧將其環(huán)境彈出,把控制權(quán)返回給之前的執(zhí)行環(huán)境。ECMAScript 程序中的執(zhí)行流 正是由這個(gè)方便的機(jī)制控制著。
全局執(zhí)行環(huán)境是最外層環(huán)境,web開發(fā)中通常認(rèn)為是window;某個(gè)執(zhí)行環(huán)境中所有代碼執(zhí)行完畢后,該環(huán)境將被銷毀,保存在其中的變量和函數(shù)也將同時(shí)被銷毀
2.當(dāng)代碼在一個(gè)環(huán)境中執(zhí)行時(shí),會(huì)創(chuàng)建變量對(duì)象的一個(gè)作用域鏈(scope chain)。作用域鏈的用途,是保證對(duì)執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。當(dāng)前的執(zhí)行環(huán)境就是作用域的最前端,標(biāo)識(shí)符解析是沿著作用域鏈最前端向后回溯,直到找到標(biāo)志符
3.當(dāng)某個(gè)函數(shù)被調(diào)用時(shí),會(huì)創(chuàng)建一個(gè)執(zhí)行環(huán)境(execution context)及相應(yīng)的作用域鏈。 然后,使用 arguments 和其他命名參數(shù)的值來初始化函數(shù)的活動(dòng)對(duì)象(activation object)。
閉包
閉包是指有權(quán)訪問另一個(gè)函數(shù)作用域中的變量的函數(shù)。創(chuàng)建閉包的常見方式,就是在一個(gè)函數(shù)內(nèi)部創(chuàng)建另一個(gè)函數(shù)。
無論什么時(shí)候在函數(shù)中訪問一個(gè)變量時(shí),就會(huì)從作用域鏈中搜索具有相應(yīng)名字的變量。一般來講, 當(dāng)函數(shù)執(zhí)行完畢后,局部活動(dòng)對(duì)象就會(huì)被銷毀,內(nèi)存中僅保存全局作用域(全局執(zhí)行環(huán)境的變量對(duì)象)。 但是,閉包的情況又有所不同。
外部函數(shù)執(zhí)行結(jié)束后,執(zhí)行環(huán)境就會(huì)在作用域鏈中銷毀,但是由于閉包函數(shù)的局部作用域鏈仍在使用其活動(dòng)對(duì)象,所以閉包函數(shù)被銷毀時(shí)外部活動(dòng)環(huán)境才能被銷毀。
由于閉包會(huì)攜帶包含它的函數(shù)的作用域,因此會(huì)比其他函數(shù)占用更多的內(nèi)存。

this
1.(默認(rèn)綁定)普通函數(shù)調(diào)用;this指向window

在嚴(yán)格模式下(strict mode),全局對(duì)象將無法使用默認(rèn)綁定,即執(zhí)行會(huì)報(bào)undefined的錯(cuò)誤

2.(隱式綁定)作為對(duì)象方法調(diào)用;this指向調(diào)用對(duì)象

3.作為構(gòu)造函數(shù)調(diào)用,this 指代實(shí)例對(duì)象

4.call() 和 apply()、bind()
主要是通過改變對(duì)象的prototype關(guān)聯(lián)對(duì)象。具體使用上,可以通過這兩個(gè)方法call(…)或apply(…)來實(shí)現(xiàn)(大多數(shù)函數(shù)及自己創(chuàng)建的函數(shù)默認(rèn)都提供這兩個(gè)方法)call與apply是同樣的作用,區(qū)別只是其他參數(shù)的設(shè)置上,
apply:調(diào)用一個(gè)對(duì)象的一個(gè)方法,用另一個(gè)對(duì)象替換當(dāng)前對(duì)象。例如:B.apply(A, arguments);即A對(duì)象應(yīng)用B對(duì)象的方法。

call:調(diào)用一個(gè)對(duì)象的一個(gè)方法,用另一個(gè)對(duì)象替換當(dāng)前對(duì)象。例如:B.call(A, args1,args2);即A對(duì)象調(diào)用B對(duì)象的方法。

bind:call和apply都是改變上下文中的this并立即執(zhí)行這個(gè)函數(shù),bind方法可以讓對(duì)應(yīng)的函數(shù)想什么時(shí)候調(diào)就什么時(shí)候調(diào)用,并且可以將參數(shù)在執(zhí)行的時(shí)候添加,這是它們的區(qū)別。
bind也可以有多個(gè)參數(shù),并且參數(shù)可以執(zhí)行的時(shí)候再次添加,但是要注意的是,參數(shù)是按照形參的順序進(jìn)行的。

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

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

相關(guān)文章

  • 談?wù)?em>javascript語法里一些難點(diǎn)問題(二)

    摘要:講作用域鏈?zhǔn)紫纫獜淖饔糜蛑v起,下面是百度百科里對(duì)作用域的定義作用域在許多程序設(shè)計(jì)語言中非常重要。原文出處談?wù)務(wù)Z法里一些難點(diǎn)問題二 3) 作用域鏈相關(guān)的問題 作用域鏈?zhǔn)莏avascript語言里非常紅的概念,很多學(xué)習(xí)和使用javascript語言的程序員都知道作用域鏈?zhǔn)抢斫鈐avascript里很重要的一些概念的關(guān)鍵,這些概念包括this指針,閉包等等,它非常紅的另一個(gè)重要原因就...

    Enlightenment 評(píng)論0 收藏0
  • 還是不明白JavaScript - 執(zhí)行環(huán)境、作用域、作用域鏈、閉包嗎?

    摘要:所以,全局執(zhí)行環(huán)境的變量對(duì)象始終都是作用域鏈中的最后一個(gè)對(duì)象。講到這里,可能你已經(jīng)對(duì)執(zhí)行環(huán)境執(zhí)行環(huán)境對(duì)象變量對(duì)象作用域作用域鏈的理解已經(jīng)他們之間的關(guān)系有了一個(gè)較清晰的認(rèn)識(shí)。 JavaScript中的執(zhí)行環(huán)境、作用域、作用域鏈、閉包一直是一個(gè)非常有意思的話題,很多博主和大神都分享過相關(guān)的文章。這些知識(shí)點(diǎn)不僅比較抽象,不易理解,更重要的是與這些知識(shí)點(diǎn)相關(guān)的問題在面試中高頻出現(xiàn)。之前我也看過...

    jlanglang 評(píng)論0 收藏0
  • 理解JavaScript中的作用域和作用域鏈

    摘要:示例當(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)部屬性[...

    XanaHopper 評(píng)論0 收藏0
  • 我所認(rèn)識(shí)的JavaScript作用域鏈和原型鏈

    摘要:為了防止之后自己又開始模糊,所以自己來總結(jié)一下中關(guān)于作用域鏈和原型鏈的知識(shí),并將二者相比較看待進(jìn)一步加深理解。因此我們發(fā)現(xiàn)當(dāng)多個(gè)作用域相互嵌套的時(shí)候,就形成了作用域鏈。原型鏈原型說完了作用域鏈,我們來講講原型鏈。   畢業(yè)也整整一年了,看著很多學(xué)弟都畢業(yè)了,忽然心中頗有感慨,時(shí)間一去不復(fù)還呀。記得從去年這個(gè)時(shí)候接觸到JavaScript,從一開始就很喜歡這門語言,當(dāng)時(shí)迷迷糊糊看完了《J...

    Bmob 評(píng)論0 收藏0
  • JavaScript作用域鏈與閉包的理解

    摘要:作用域是最重要的概念之一,想要學(xué)好就需要理解作用域和作用域鏈的工作原理。腳本錯(cuò)誤腳本錯(cuò)誤由此可以引發(fā)作用域鏈的概念在中,函數(shù)也是對(duì)象,實(shí)際上,里一切都是對(duì)象。當(dāng)一個(gè)函數(shù)創(chuàng)建后,它的作用域鏈會(huì)被創(chuàng)建此函數(shù)的作用域中可訪問的數(shù)據(jù)對(duì)象填充。 作用域是JavaScript最重要的概念之一,想要學(xué)好JavaScript就需要理解JavaScript作用域和作用域 鏈的工作原理。 1. 全局作...

    tianhang 評(píng)論0 收藏0
  • JavaScript作用域鏈與閉包的理解

    摘要:作用域是最重要的概念之一,想要學(xué)好就需要理解作用域和作用域鏈的工作原理。腳本錯(cuò)誤腳本錯(cuò)誤由此可以引發(fā)作用域鏈的概念在中,函數(shù)也是對(duì)象,實(shí)際上,里一切都是對(duì)象。當(dāng)一個(gè)函數(shù)創(chuàng)建后,它的作用域鏈會(huì)被創(chuàng)建此函數(shù)的作用域中可訪問的數(shù)據(jù)對(duì)象填充。 作用域是JavaScript最重要的概念之一,想要學(xué)好JavaScript就需要理解JavaScript作用域和作用域 鏈的工作原理。 1. 全局作...

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

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

0條評(píng)論

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