摘要:作用域鏈的用途,是保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。當前的執(zhí)行環(huán)境就是作用域的最前端,標識符解析是沿著作用域鏈最前端向后回溯,直到找到標志符當某個函數(shù)被調(diào)用時,會創(chuàng)建一個執(zhí)行環(huán)境及相應(yīng)的作用域鏈。
變量
由于JavaScript變量松散類型的本質(zhì),決定了它只是在特定時間用于保存特定值的一個名字而已。變量分為基礎(chǔ)類型值和引用類型值;
基本類型值指的是簡單的數(shù)據(jù)段(Undefined、Null、Boolean、Number、String 和 symbol),而引用類型值指那些可能由多個值構(gòu)成的對象。
引用類型的值是保存在內(nèi)存中的對象。與其他語言不同,JavaScript 不允許直接訪問內(nèi)存中的位置, 也就是說不能直接操作對象的內(nèi)存空間。在操作對象時,實際上是在操作對象的引用而不是實際的對象。 為此,引用類型的值是按引用訪問的
var obj1 = new Object();
var obj2 = obj1; obj1.name = "Nicholas"; alert(obj2.name); //"Nicholas"
作用域鏈
1.執(zhí)行環(huán)境
執(zhí)行環(huán)境(execution context,為簡單起見,有時也稱為“環(huán)境”)定義了變量或函數(shù)有權(quán)訪問的其他數(shù)據(jù),決定了它們各自的行為。
每個函數(shù)都有自己的執(zhí)行環(huán)境。當執(zhí)行流進入一個函數(shù)時,函數(shù)的環(huán)境就會被推入一個環(huán)境棧中。 而在函數(shù)執(zhí)行之后,棧將其環(huán)境彈出,把控制權(quán)返回給之前的執(zhí)行環(huán)境。ECMAScript 程序中的執(zhí)行流 正是由這個方便的機制控制著。
全局執(zhí)行環(huán)境是最外層環(huán)境,web開發(fā)中通常認為是window;某個執(zhí)行環(huán)境中所有代碼執(zhí)行完畢后,該環(huán)境將被銷毀,保存在其中的變量和函數(shù)也將同時被銷毀
2.當代碼在一個環(huán)境中執(zhí)行時,會創(chuàng)建變量對象的一個作用域鏈(scope chain)。作用域鏈的用途,是保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。當前的執(zhí)行環(huán)境就是作用域的最前端,標識符解析是沿著作用域鏈最前端向后回溯,直到找到標志符
3.當某個函數(shù)被調(diào)用時,會創(chuàng)建一個執(zhí)行環(huán)境(execution context)及相應(yīng)的作用域鏈。 然后,使用 arguments 和其他命名參數(shù)的值來初始化函數(shù)的活動對象(activation object)。
閉包
閉包是指有權(quán)訪問另一個函數(shù)作用域中的變量的函數(shù)。創(chuàng)建閉包的常見方式,就是在一個函數(shù)內(nèi)部創(chuàng)建另一個函數(shù)。
無論什么時候在函數(shù)中訪問一個變量時,就會從作用域鏈中搜索具有相應(yīng)名字的變量。一般來講, 當函數(shù)執(zhí)行完畢后,局部活動對象就會被銷毀,內(nèi)存中僅保存全局作用域(全局執(zhí)行環(huán)境的變量對象)。 但是,閉包的情況又有所不同。
外部函數(shù)執(zhí)行結(jié)束后,執(zhí)行環(huán)境就會在作用域鏈中銷毀,但是由于閉包函數(shù)的局部作用域鏈仍在使用其活動對象,所以閉包函數(shù)被銷毀時外部活動環(huán)境才能被銷毀。
由于閉包會攜帶包含它的函數(shù)的作用域,因此會比其他函數(shù)占用更多的內(nèi)存。
this
1.(默認綁定)普通函數(shù)調(diào)用;this指向window
在嚴格模式下(strict mode),全局對象將無法使用默認綁定,即執(zhí)行會報undefined的錯誤
2.(隱式綁定)作為對象方法調(diào)用;this指向調(diào)用對象
3.作為構(gòu)造函數(shù)調(diào)用,this 指代實例對象
4.call() 和 apply()、bind()
主要是通過改變對象的prototype關(guān)聯(lián)對象。具體使用上,可以通過這兩個方法call(…)或apply(…)來實現(xiàn)(大多數(shù)函數(shù)及自己創(chuàng)建的函數(shù)默認都提供這兩個方法)call與apply是同樣的作用,區(qū)別只是其他參數(shù)的設(shè)置上,
apply:調(diào)用一個對象的一個方法,用另一個對象替換當前對象。例如:B.apply(A, arguments);即A對象應(yīng)用B對象的方法。
call:調(diào)用一個對象的一個方法,用另一個對象替換當前對象。例如:B.call(A, args1,args2);即A對象調(diào)用B對象的方法。
bind:call和apply都是改變上下文中的this并立即執(zhí)行這個函數(shù),bind方法可以讓對應(yīng)的函數(shù)想什么時候調(diào)就什么時候調(diào)用,并且可以將參數(shù)在執(zhí)行的時候添加,這是它們的區(qū)別。
bind也可以有多個參數(shù),并且參數(shù)可以執(zhí)行的時候再次添加,但是要注意的是,參數(shù)是按照形參的順序進行的。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/101800.html
摘要:講作用域鏈首先要從作用域講起,下面是百度百科里對作用域的定義作用域在許多程序設(shè)計語言中非常重要。原文出處談?wù)務(wù)Z法里一些難點問題二 3) 作用域鏈相關(guān)的問題 作用域鏈是javascript語言里非常紅的概念,很多學(xué)習(xí)和使用javascript語言的程序員都知道作用域鏈是理解javascript里很重要的一些概念的關(guān)鍵,這些概念包括this指針,閉包等等,它非常紅的另一個重要原因就...
摘要:所以,全局執(zhí)行環(huán)境的變量對象始終都是作用域鏈中的最后一個對象。講到這里,可能你已經(jīng)對執(zhí)行環(huán)境執(zhí)行環(huán)境對象變量對象作用域作用域鏈的理解已經(jīng)他們之間的關(guān)系有了一個較清晰的認識。 JavaScript中的執(zhí)行環(huán)境、作用域、作用域鏈、閉包一直是一個非常有意思的話題,很多博主和大神都分享過相關(guān)的文章。這些知識點不僅比較抽象,不易理解,更重要的是與這些知識點相關(guān)的問題在面試中高頻出現(xiàn)。之前我也看過...
摘要:示例當一個函數(shù)創(chuàng)建后,它的作用域鏈會被創(chuàng)建此函數(shù)的作用域中可訪問的數(shù)據(jù)對象填充。每一個運行期上下文都和一個作用域鏈關(guān)聯(lián)。此時,作用域鏈中函數(shù)的所有局部變量所在的作用域?qū)ο髸煌坪?,訪問代價變高了。 作用域 作用域就是變量與函數(shù)的可訪問范圍,即作用域控制著變量與函數(shù)的可見性和生命周期。在JavaScript中,變量的作用域有全局作用域和局部作用域兩種。 作用域鏈 函數(shù)對象有一個內(nèi)部屬性[...
摘要:為了防止之后自己又開始模糊,所以自己來總結(jié)一下中關(guān)于作用域鏈和原型鏈的知識,并將二者相比較看待進一步加深理解。因此我們發(fā)現(xiàn)當多個作用域相互嵌套的時候,就形成了作用域鏈。原型鏈原型說完了作用域鏈,我們來講講原型鏈。 畢業(yè)也整整一年了,看著很多學(xué)弟都畢業(yè)了,忽然心中頗有感慨,時間一去不復(fù)還呀。記得從去年這個時候接觸到JavaScript,從一開始就很喜歡這門語言,當時迷迷糊糊看完了《J...
摘要:作用域是最重要的概念之一,想要學(xué)好就需要理解作用域和作用域鏈的工作原理。腳本錯誤腳本錯誤由此可以引發(fā)作用域鏈的概念在中,函數(shù)也是對象,實際上,里一切都是對象。當一個函數(shù)創(chuàng)建后,它的作用域鏈會被創(chuàng)建此函數(shù)的作用域中可訪問的數(shù)據(jù)對象填充。 作用域是JavaScript最重要的概念之一,想要學(xué)好JavaScript就需要理解JavaScript作用域和作用域 鏈的工作原理。 1. 全局作...
摘要:作用域是最重要的概念之一,想要學(xué)好就需要理解作用域和作用域鏈的工作原理。腳本錯誤腳本錯誤由此可以引發(fā)作用域鏈的概念在中,函數(shù)也是對象,實際上,里一切都是對象。當一個函數(shù)創(chuàng)建后,它的作用域鏈會被創(chuàng)建此函數(shù)的作用域中可訪問的數(shù)據(jù)對象填充。 作用域是JavaScript最重要的概念之一,想要學(xué)好JavaScript就需要理解JavaScript作用域和作用域 鏈的工作原理。 1. 全局作...
閱讀 2296·2023-04-25 16:42
閱讀 1202·2021-11-22 14:45
閱讀 2338·2021-10-19 13:10
閱讀 2827·2021-09-29 09:34
閱讀 3408·2021-09-23 11:21
閱讀 2100·2021-08-12 13:25
閱讀 2180·2021-07-30 15:15
閱讀 3491·2019-08-30 15:54