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