溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Javascript作用域問題是怎樣的

發(fā)布時間:2021-11-17 10:22:33 來源:億速云 閱讀:143 作者:柒染 欄目:web開發(fā)

本篇文章為大家展示了Javascript作用域問題是怎樣的,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

在前端學習中,作用域這個問題一直被廣泛提起,什么是作用域,什么又是作用域鏈?在Javascript中,怎么去理解這些概念都是學好這門語言的關(guān)鍵,所以在學習前端開發(fā)的過程中,我需要也很有必要去學習和總結(jié)下javascript----作用域。

作用域并不難,但是去很少有人能稍微深入的解釋什么是作用域,知其然而不知其所以然顯然是遠遠不夠的,所以我們就深入淺出一下,

談到作用域就不得不談到一個名詞----執(zhí)行環(huán)境。什么叫執(zhí)行環(huán)境呢?

執(zhí)行環(huán)境是Javascript中最為重要的一個概念,它定義了變量或函數(shù)有權(quán)訪問其他數(shù)據(jù),決定了他們各自的行為。那么在每個執(zhí)行環(huán)境中都有一個叫做“變量對象”的object,執(zhí)行環(huán)境中的所有變量和函數(shù)都保存在這個對象中,這個object是無法被訪問到了,它只能在后臺被javascript解釋器訪問到。

瀏覽器在解析Javascript代碼的時候會為每個函數(shù)創(chuàng)建一個執(zhí)行環(huán)境,并在該執(zhí)行環(huán)境中生成一個變量對象來存儲變量和其內(nèi)部的函數(shù)。我們常常用到的window就是最外圍的執(zhí)行環(huán)境,也叫全局執(zhí)行環(huán)境,每個執(zhí)行環(huán)境的代碼執(zhí)行完成之后,該環(huán)境被銷毀,其中的變量對象也將被銷毀,而全局執(zhí)行環(huán)境只會在瀏覽器或網(wǎng)頁關(guān)閉的時候被銷毀,其他的執(zhí)行環(huán)境(或者內(nèi)部的)則為局部執(zhí)行環(huán)境(函數(shù))。

每個函數(shù)都有自己的執(zhí)行環(huán)境,那么當代碼的執(zhí)行流進入到一個函數(shù)時,會將該執(zhí)行環(huán)境推入到一個環(huán)境棧中,在函數(shù)執(zhí)行完成之后又將其彈出,把對這個執(zhí)行環(huán)境的控制權(quán)交還給之前的執(zhí)行環(huán)境,當代碼在一個執(zhí)行環(huán)境中執(zhí)行的時候,會將該環(huán)境中的變量對象連入到作用域鏈中。作用域鏈的作用就是保證對執(zhí)行環(huán)境中的有權(quán)訪問的變量和函數(shù)有序的訪問。說到這里,大家可能有些迷糊啦,那么就用點代碼和圖片來解釋下吧。

//window scope  var name0 = 'scope0'<p>console.log(name0)  //這里可以訪問到name0  function scope1(){<p>      var name1 = 'scope1'<p> console.log(name0,name1)  //這里可以訪問到name0,name1      function scope2(){          var name2 = 'scope2'<p> console.log(name0,name1,name2) //這里可以訪問到name0,name1,name2           function scope3(){              var name3 = 'scope3'<p>console.log(name0,name1,name2,name3) //這里可以訪問到name0,name1,name2,name3          }      }  }

當JS解釋器去執(zhí)行這段代碼的時候,會生成4個執(zhí)行環(huán)境,分別是window,scope1,scope2,scope3。然后再執(zhí)行JS代碼的時候,會把每個執(zhí)行環(huán)境推入到執(zhí)行棧中,并生成變量對象給連接到作用域鏈中(從上到下),***生成的作用域鏈就為:

window&rarr;scope1&rarr;scope2&rarr;scope3

對于每個執(zhí)行環(huán)境中的變量對象來說,它的作用域鏈就是它本生加上它之前的變量對象(例如scope2的作用域鏈就是scope2和它之前的 scope1和window)。我們先前說道,每個執(zhí)行環(huán)境中的變量對象就是該執(zhí)行環(huán)境能夠訪問到了變量和函數(shù),個人理解為這個函數(shù)就是變量對象的作用域 鏈上其他的變量對象,那么就很好理解了,我們分析下上面代碼scope2的變量對象上有哪些東西,首先是參數(shù)數(shù)組(arguments,這里為[])還有 name2變量,然后是scope1的變量對象和全局變量對象。

說了這么多,提了那么多概念和名詞,我們好像只是說到了作用域鏈,但是并沒有說到作用域,這不是扯淡嘛?。。?!好吧,我們現(xiàn)在就來談談作用域。

還是先來扯下概念吧。是每個執(zhí)行環(huán)境可以通過作用域鏈向上訪問這個他的作用域鏈的其他執(zhí)行環(huán)境,但是不能向下訪問。這個就是作用域啦。

還是拿scope2函數(shù)來說吧,他可以訪問name2,name1,name0但是不能訪問name3,這個就是作用域的限定,他只能訪問到 scope1和window的執(zhí)行環(huán)境(還有它本身)。額,就這么一小段,我自己都醉了,但是個人覺得作用域就這點東西,關(guān)鍵的是在與對執(zhí)行環(huán)境、變量對 象和作用域鏈的理解。這些才是扎實的理解Javascript作用域的關(guān)鍵。

上述內(nèi)容就是Javascript作用域問題是怎樣的,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI