javaScript变量、作用域链
變量
JavaScript 變量松散類型的本質,決定了它只是在特定時間用于保存特定值的一個名字而已。
變量分為基礎類型值和引用類型值;
基本類型值指的是 簡單的數據段(Undefined、Null、Boolean、Number 和 String),而引用類型值指那些可能由多個值構成的對象。
引用類型的值是保存在內存中的對象。與其他語言不同,JavaScript 不允許直接訪問內存中的位置, 也就是說不能直接操作對象的內存空間。在操作對象時,實際上是在操作對象的引用而不是實際的對象。 為此,引用類型的值是按引用訪問的
var obj1 = new Object();
作用域鏈
1.執行環境
執行環境(execution context,為簡單起見,有時也稱為“環境”)定義了變量或函數有權訪問的其他數據,決定了它們各自的行為。
每個函數都有自己的執行環境。當執行流進入一個函數時,函數的環境就會被推入一個環境棧中。 而在函數執行之后,棧將其環境彈出,把控制權返回給之前的執行環境。ECMAScript 程序中的執行流 正是由這個方便的機制控制著。
全局執行環境是最外層環境,web開發中通常認為是window;某個執行環境中所有代碼執行完畢后,該環境將被銷毀,保存在其中的變量和函數也將同時被銷毀
2.當代碼在一個環境中執行時,會創建變量對象的一個作用域鏈(scope chain)。作用域鏈的用途,是保證對執行環境有權訪問的所有變量和函數的有序訪問。當前的執行環境就是作用域的最前端,標識符解析是沿著作用域鏈最前端向后回溯,直到找到標志符
3.當某個函數被調用時,會創建一個執行環境(execution context)及相應的作用域鏈。 然后,使用 arguments 和其他命名參數的值來初始化函數的活動對象(activation object)。
閉包
閉包是指有權訪問另一個函數作用域中的變量的函數。創建閉包的常見方式,就是在一個函數內部創建另一個函數。
無論什么時候在函數中訪問一個變量時,就會從作用域鏈中搜索具有相應名字的變量。一般來講, 當函數執行完畢后,局部活動對象就會被銷毀,內存中僅保存全局作用域(全局執行環境的變量對象)。 但是,閉包的情況又有所不同。
外部函數執行結束后,執行環境就會在作用域鏈中銷毀,但是由于閉包函數的局部作用域鏈仍在使用其活動對象,所以閉包函數被銷毀時外部活動環境才能被銷毀。
由于閉包會攜帶包含它的函數的作用域,因此會比其他函數占用更多的內存。
this
1.(默認綁定)普通函數調用;this指向window
在嚴格模式下(strict mode),全局對象將無法使用默認綁定,即執行會報undefined的錯誤
2.(隱式綁定)作為對象方法調用;this指向調用對象
3.作為構造函數調用,this 指代實例對象
4.call() 和 apply()
主要是通過改變對象的prototype關聯對象。具體使用上,可以通過這兩個方法call(…)或apply(…)來實現(大多數函數及自己創建的函數默認都提供這兩個方法)call與apply是同樣的作用,區別只是其他參數的設置上,
apply:調用一個對象的一個方法,用另一個對象替換當前對象。例如:B.apply(A, arguments);即A對象應用B對象的方法。
call:調用一個對象的一個方法,用另一個對象替換當前對象。例如:B.call(A, args1,args2);即A對象調用B對象的方法。
總結
以上是生活随笔為你收集整理的javaScript变量、作用域链的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 管理之善,在于让员工有机会试错
- 下一篇: 为何说国内云桌面已经步入成熟期