javascript --- 作用域和閉包

執行環境:

// 定義了變量或函數有權訪問的其他數據,決定了它們各自的行為
// 每個執行環境都有一個變量對象與之對應,執行環境中所定義的所有變量和函數都保存在變量對象中
// 某個執行環境中的所有代碼執行完畢后,該執行環境被銷毀,保存在其中的所有變量和函數定義也隨之銷毀

函數與執行環境:

// 每個函數都有自己的執行環境.當執行流進入一個函數時,函數的環境就會被推入一個環境棧中.
// 在函數執行之后,棧將其環境彈出,把控制權返回給之前的執行環境.

作用域鏈:

// 當代碼在一個環境中執行時,會創建變量對象的一個作用域鏈.作用域鏈的用途,是保證對執行環境有權訪問的所有變量和函數的有序訪問。
// 作用域鏈的前端,始終都是當前執行的代碼(又稱為詞法作用域)所在環境的變量對象.如果這個環境是函數,則將其活動對象作為變量對象.
// 活動對象在最開始時只包含一個變量,即arguments對象.
// 作用域鏈中的下一個變量來自包含(外部)環境,而在下一個變量對象來自下一個包含環境.
// 這樣,一直延續到全局執行環境;全局執行環境的變量對象始終都是作用域鏈中的最后一個對象// 參考下面的例子
var color = "blue";
function changeColor() {var anotherColor = "red";function swapColors() {var tempColor = anotherColor;anotherColor = color;color = tempColor;}swapColors();
}
changeColor();
console.log(color); 
// 作用域鏈的結構如下:
// Window
//    -- color
//    -- changeColor()
//        -- anotherColor
//        -- swapColors()
//            -- tempColor// 一共3個執行環境:全局環境、changeColor()的局部環境和swapColors()的局部環境
// swapColors是changeColor的內部環境,changeColor是全局環境的內部環境
// 通過作用域鏈,可以從內而外 依次、有序的訪問.

下面從最簡單的全局作用域開始,深入挖掘各類解析方案從而涵蓋JavaScript提供的所有作用域

延長作用域鏈:

// 1.eval:可以接受一個字符串為參數,并將其中的內容視為好像在書寫時就存在于程序中這個位置的代碼
function foo(str, a) {eval(str);console.log(a, b);
}
var b = 2;
foo("var b = 3;",1 );// 等價于:
function foo(a) {var b = 3;console.log(a,b,);
}
var b = 2;
foo(1)
// 作用域鏈
// Window
//    - b
//    - foo
//        - b
//        - a// 2.with:通常被當作重復引用同一個對象中的多個屬性的快捷方式:
function foo(obj) {with(obj) {a = 2;  }
};
var o1 = {a: 3
};
var o2 = {b: 3
};
foo(o1);
console.log(o1.a);    // 2foo(o2);
console.log(o2.1);    // undefined
console.log(a);    // 2,泄露到全局上// o2的作用域,foo(...)的作用域和全局作用域中都沒有找到標識符a,因此在執行a = 2時,自動創建了一個全局變量
// ps:盡量不用eval 和 with,會影響執行效率!!!

先來看下面的一段代碼:

function foo() {var a = 2;function bar () {console.log( a );}return bar;
}
var baz = foo();
baz(); // 2// 1.函數bar()的詞法作用域可以訪問foo()的內部作用域,
// 2.在foo()執行后,由于javascript引擎的垃圾回收機制會釋放不在使用的內存空間.
// 3.閉包,阻止了foo()的內部作用于的釋放,原因在于bar()擁有涵蓋foo()內部作用域的閉包,使得foo的內部作用域一直存活,以供bar()一直使用// 注:bar()對foo作用域的引用,該引用叫做閉包(閉包可以使得函數繼續訪問定義時的詞法作用域).

參考 《JavaScript高級程序設計》(第3版)P73~P74
參考《你不知道的JavaScript》(上卷)P14~P57

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251247.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251247.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251247.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

異步下載圓形進度條顯示進度

圓形進度條參考鏈接即可:使用css3實現圓形進度條 需求點擊下載后遮罩層顯示下載進度: 1.圓形進度條參考以上鏈接,有點小瑕疵,可更改定位距離實現重合。 2.遮罩層: .lbOverlay{display: none;position: fixed;left: 0;…

javascript基本功

隱式類型轉換 var a {_default: 0,toString: function () {return a._default} } if (a 1 && a 2 && a 3) {console.log(解) } 訪問一個變量的時候進行攔截 var _default 0 Object.defineProperty(window, a, {get() {return _default} }) if (a 1 &am…

深信服筆試,抓兔子

*問題描述:抓兔子n個排成一排的洞,編號為1到n,兔子每天晚上會跳到相鄰的一個洞里,小q每天只能白天檢查其中的一個洞,小q會告訴你每天檢查的洞,分析是否一定能抓到兔子示例:3個洞,第一…

es6 --- 模塊

function foo(){var something cool;var another [1, 2, 3];function doSomething() {console.log( something );}function doAnother() {console.log( another.join( " ! " ) );} } // 是一個不明顯的閉包,doSomething()和doAnother()保持了foo的內部作用域接下來…

Java之遞歸遍歷目錄,修改指定文件的指定內容

EditProperties.java 1 package PropertiesOperation.Edit;2 3 import java.io.File;4 5 /**6 * 替換指定Porpoerties文件中的指定內容7 * 三個參數:8 * filePath:存放properties文件的目錄9 * srcStr:需要替換的字符串 10 * desStr&…

學習日志---7

1.復習Linux hadoop hdfs MapReduce基礎知識 1,列舉linux常用命令 shutdown now reboot mkdir mkdir -p touch filename rm -r filename rm -rf filename vi filename i--->可編輯狀態 esc --> : --->wq 保存退出 q! wq! cat grep find ifconfig ping user…

javascript --- 屬性描述符

從ES5開始,所有的屬性都具備了屬性描述符 var myObject {a: 2 };Object.getOwnPropertyDescriptor(myObject, "a"); //{ // value:2, // writable: true, // 可寫 // enumerable: true, // 可枚舉 // configurble: true // 可配置 //}定義屬性…

看了嗎網址鏈接

sklearn實戰-乳腺癌細胞數據挖掘(博主親自錄制視頻) https://study.163.com/course/introduction.htm?courseId1005269003&utm_campaigncommission&utm_sourcecp-400000000398149&utm_mediumshare # -*- coding: utf-8 -*- ""&qu…

JMeter 性能測試進階實戰

課程簡介 本課程制作的主要目的是為了讓大家快速上手 JMeter,期間穿插了大量主流項目中用到的技術,以及結合當今主流微服務技術提供了測試 Dubbo 接口、Java 工程技術具體實施方案,注重實踐、注意引導測試思維、拒絕枯燥的知識點羅列、善于用…

javascript --- 混入

顯示混入: function mixin(sourceObj, targetObj){for(var key in sourceObj){ // 遍歷source中的所有屬性if(!(key in targetObj)) { // 找到targetz中沒有的屬性targetObj[key] sourceObj[key];}}return targetObj; }var Vehicle {engines: 1,iginition: function() {c…

php源碼代目錄

ext :存放動態和內建模塊的目錄,在這里可以找到所有的php官方虧站,并且也可以在這里編寫擴展; main:包含php的主要宏定義; pear: PHP擴展與應用庫; sapi:包含不同服務器抽象層的代碼; TSRM:Zend和PHP的"線程安全資源管理器"目錄; Z…

bzoj1231 [Usaco2008 Nov]mixup2 混亂的奶牛——狀壓DP

題目&#xff1a;https://www.lydsy.com/JudgeOnline/problem.php?id1231 小型狀壓DP&#xff1b; f[i][j] 表示狀態為 j &#xff0c;最后一個奶牛是 i 的方案數&#xff1b; 所以下一個只能是和它相差大于 k 而且不在狀態中的奶牛。 代碼如下&#xff1a; #include<iostr…

JavaScript高級程序設計閱讀筆記

2020-11-15 通過初始化指定變量類型 數字-1 對象null和null的比較&#xff08;不理解&#xff09;使用局部變量將屬性查找替換為值查找&#xff08;算法復雜度&#xff09;循環的減值迭代&#xff0c;降低了計算終止條件的復雜度switch快多個變量聲明逗號隔開使用數組和對象字面…

jquery --- 監聽input框失效

使用juery監聽Input輸入的變化,并且封裝起來,如下: // html <input type"text" id‘myinput1’ /> // js function formOnById(id){let dom # id;$(dom).bind(input propertychange,()>{let item $(dom).val;console.log(item);} } formOnById(myinp…

windows任務計劃程序 坑

轉載于:https://www.cnblogs.com/kaibindirver/p/8109041.html

第三篇:函數之嵌套

1 #函數的嵌套調用&#xff1a;在調用一個函數的時&#xff0c;其內部的代碼又調用其他的函數2 # def bar():3 # print(from bar)4 #5 # def foo():6 # print(from foo)7 # bar()8 #9 # foo() 10 11 12 # def max2(x,y): 13 # if x > y: 14 # ret…

vue路由權限(結合服務端koa2)

gitee地址 一、項目初始化 vue create manager-admin // 創建vue項目// 管理員權限安裝 cnpm i -S koa2 // 下載koa2依賴 cnpm install --global koa-generator // 下載框架 koa-generator koa2 manager-server // 創建項目 cd manager-server // 進入項目 npm install // 安…

javascript --- 類、class、事件委托的編程風格

類風格: // 父類 function Widget(width, height) {this.width width || 50;this.height height || 50;this.$elem null; } Widget.prototype.render function($where) {if(this.$elem) {this.$elem.css({width: this.width "px",height: this.height "p…

在線獲取UUID

http://fir.im/udid轉載于:https://www.cnblogs.com/mtjbz/p/8116576.html

堆和堆排序

堆和優先隊列 普通隊列&#xff1a;FIFO&#xff0c;LILO 優先隊列&#xff1a;出隊順序和入隊順序無關&#xff0c;和優先級相關。一個典型應用就是操作系統中。動態選擇優先級高的任務執行 堆的實現 最典型的堆就是二叉堆&#xff0c;就像是一顆二叉樹。這個堆的特點&#xf…