摘要:函數的作用域會在函數執行時用到,函數每次執行都會創建一個執行環境的內部對象,每個執行環境都有自己的作用域鏈。假設執行,其對應的作用域鏈如下函數執行過程中,變量的查找時從作用域頭部開始查找,如果找到就是使用改變量的值。
每一個函數存在一個[[Scope]]內部屬性,包含了一個函數被創建得作用域中對象得集合,這個集合為函數得作用域鏈。例如下面的全局函數:
fucntion add(num1, num2){ var sum = num1 + num2; return sum; }
當函數add被創建時,它的作用域鏈中便插入了一個對象變量,里面包含所有在全局范圍內定義的變量。
函數add的作用域會在函數執行時用到,函數每次執行都會創建一個執行環境的內部對象,每個執行環境都有自己的作用域鏈。函數運行時,一個被稱為活動對象的新對象就為執行環境創建好了,里面包含了函數的所有局部變量,命名參數,參數集合以及this。假設執行var total = add(5,10),其對應的作用域鏈如下:
函數執行過程中,變量的查找時從作用域頭部開始查找,如果找到就是使用改變量的值。如果找不到就繼續從作用域下一個對象查找,直到找到改變量。如過匹配不到,則為undefined。當頻繁使用全局變量時,可以先使用一個局部變量保存起來,之后直接訪問局部變量可以減少查找次數提高效率。例如:
function initUI(){ var doc = document, bd = doc.body, links = doc.getElementsByTagName("a"); .... }
當函數執行完成,活動對象也會隨之銷毀。但閉包時,活動對象并不會銷毀。這也是為什么閉包占用內存大的原因。
資料:《高性能JavaScript》第2章節
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/102186.html
摘要:之前一篇文章我們詳細說明了變量對象,而這里,我們將詳細說明作用域鏈。而的作用域鏈,則同時包含了這三個變量對象,所以的執行上下文可如下表示。下圖展示了閉包的作用域鏈。其中為當前的函數調用棧,為當前正在被執行的函數的作用域鏈,為當前的局部變量。 showImg(https://segmentfault.com/img/remote/1460000008329355);初學JavaScrip...
摘要:作用域執行上下文變量提前函數聲明提前確定值范圍一段或者一個函數都會生成一個執行上下文全局一段變量定義函數聲明函數變量定義函數聲明參數集合變量提前代碼解析執行過程變量定義提前賦值函數聲明提前代碼解析函數聲明函數表達式執行過程執行過程執行時才能 1.作用域 執行上下文 (變量提前、函數聲明提前、確定this值、arguments) 范圍:一段或者一個函數(都會生成一個執行上下文) ...
摘要:在之前我們根絕對象的原型說過了的原型鏈,那么同樣的萬物皆對象,函數也同樣存在這么一個鏈式的關系,就是函數的作用域鏈作用域鏈首先先來回顧一下之前講到的原型鏈的尋找機制,就是實例會先從本身開始找,沒有的話會一級一級的網上翻,直到頂端沒有就會報一 在之前我們根絕對象的原型說過了js的原型鏈,那么同樣的js 萬物皆對象,函數也同樣存在這么一個鏈式的關系,就是函數的作用域鏈 作用域鏈 首先先來回...
摘要:圖片中的作用域鏈,是全局執行環境中的作用域鏈。然后此活動對象被推入作用域鏈的最前端。在最后調用的時候,創建先構建作用域鏈,再創建執行環境,再創建執行環境的時候發現了一個變量標識符。 從圖書館翻過各種JS的書之后,對作用域/執行環境/閉包這些概念有了一個比較清晰的認識。 栗子說明一切 第一個栗子 來看一個來自ECMA-262的栗子: var x = 10; (function foo(...
摘要:在的開發者工具中,通過斷點調試,我們能夠非常方便的一步一步的觀察的執行過程,直觀感知函數調用棧,作用域鏈,變量對象,閉包,等關鍵信息的變化。其中表示當前的局部變量對象,表示當前作用域鏈中的閉包。 showImg(https://segmentfault.com/img/remote/1460000008404321); 在前端開發中,有一個非常重要的技能,叫做斷點調試。 在chrome...
閱讀 3233·2021-11-22 12:07
閱讀 1876·2021-10-12 10:11
閱讀 1041·2019-08-30 15:44
閱讀 2935·2019-08-30 12:45
閱讀 2185·2019-08-29 16:41
閱讀 1636·2019-08-29 16:35
閱讀 2621·2019-08-29 12:57
閱讀 1148·2019-08-26 13:51