日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

javascript --- 作用域和闭包

發(fā)布時(shí)間:2023/12/10 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 javascript --- 作用域和闭包 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

執(zhí)行環(huán)境:

// 定義了變量或函數(shù)有權(quán)訪問的其他數(shù)據(jù),決定了它們各自的行為 // 每個(gè)執(zhí)行環(huán)境都有一個(gè)變量對(duì)象與之對(duì)應(yīng),執(zhí)行環(huán)境中所定義的所有變量和函數(shù)都保存在變量對(duì)象中 // 某個(gè)執(zhí)行環(huán)境中的所有代碼執(zhí)行完畢后,該執(zhí)行環(huán)境被銷毀,保存在其中的所有變量和函數(shù)定義也隨之銷毀

函數(shù)與執(zhí)行環(huán)境:

// 每個(gè)函數(shù)都有自己的執(zhí)行環(huán)境.當(dāng)執(zhí)行流進(jìn)入一個(gè)函數(shù)時(shí),函數(shù)的環(huán)境就會(huì)被推入一個(gè)環(huán)境棧中. // 在函數(shù)執(zhí)行之后,棧將其環(huán)境彈出,把控制權(quán)返回給之前的執(zhí)行環(huán)境.

作用域鏈:

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

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

延長(zhǎng)作用域鏈:

// 1.eval:可以接受一個(gè)字符串為參數(shù),并將其中的內(nèi)容視為好像在書寫時(shí)就存在于程序中這個(gè)位置的代碼 function foo(str, a) {eval(str);console.log(a, b); } var b = 2; foo("var b = 3;",1 );// 等價(jià)于: function foo(a) {var b = 3;console.log(a,b,); } var b = 2; foo(1) // 作用域鏈 // Window // - b // - foo // - b // - a// 2.with:通常被當(dāng)作重復(fù)引用同一個(gè)對(duì)象中的多個(gè)屬性的快捷方式: 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(...)的作用域和全局作用域中都沒有找到標(biāo)識(shí)符a,因此在執(zhí)行a = 2時(shí),自動(dòng)創(chuàng)建了一個(gè)全局變量 // ps:盡量不用eval 和 with,會(huì)影響執(zhí)行效率!!!

先來看下面的一段代碼:

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

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

總結(jié)

以上是生活随笔為你收集整理的javascript --- 作用域和闭包的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。