国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

javascript作用域的有序性

1fe1se / 2321人閱讀

摘要:如果是嵌套的作用域的話,這些嵌套作用域會(huì)通過(guò)作用域鏈把嵌套作用域聯(lián)系在一起。全局沒(méi)有則報(bào)錯(cuò)但是上級(jí)作用域沒(méi)法通過(guò)作用域鏈訪問(wèn)下級(jí)作用域。通過(guò)作用域鏈能讓引擎對(duì)執(zhí)行環(huán)境里所有有權(quán)訪問(wèn)的變量和函數(shù)進(jìn)行有序訪問(wèn)。

一 為什么要有作用域

我們知道,變量對(duì)于程序來(lái)說(shuō)是至關(guān)重要的,如果沒(méi)有變量存儲(chǔ)和訪問(wèn)值,整個(gè)程序會(huì)受到限制。那么問(wèn)題來(lái)了,既然程序這么需要變量,那么它到底是怎么樣去存儲(chǔ)變量和使用變量的呢?存儲(chǔ)變量這里暫且不提,到時(shí)候會(huì)有專(zhuān)門(mén)一篇博客來(lái)說(shuō)明這個(gè)問(wèn)題。我們這次說(shuō)的主要就是如何去使用變量。這就要牽扯到我們今天的主題作用域上面了。
概括的來(lái)說(shuō),作用域就是一套能讓你有序訪問(wèn)變量的規(guī)則。(注意有序很重要)javascript中只有函數(shù)能封閉作用域(let函數(shù)也能綁定一個(gè)塊級(jí)作用域,這里先不做討論).

二 作用域的有序性

來(lái)看下面一個(gè)例子

function foo (a) {
  var b = a * 2
  function bar (c) {
    console.log(a, b, c)
  }
  bar(b * 3)
  console.log(c)
}
foo(2)

(1)foo函數(shù)內(nèi)部會(huì)形成一個(gè)作用域
(2)bar函數(shù)內(nèi)部會(huì)形成一個(gè)作用域
(3)有一個(gè)全局的作用域
我們前面說(shuō)過(guò),作用域是一套能讓你有序訪問(wèn)變量的規(guī)則,那么上述代碼運(yùn)行的時(shí)候,作用域是怎么樣訪問(wèn)變量的呢?來(lái)看看下面的示意圖。

,一個(gè)是函數(shù)bar的作用域,一個(gè)是函數(shù)foo的作用域,一個(gè)是全局的作用域。并且這三個(gè)作用域是嵌套的。
(1)bar作用域中有一個(gè)變量c
(2)foo作用域中有三個(gè)變量a,b,bar
(3)全局作用域中有一個(gè)變量foo
我們來(lái)看看上面代碼的運(yùn)行過(guò)程,首先執(zhí)行最外層的foo(2),foo在調(diào)用棧調(diào)用bar,bar執(zhí)行。但是注意bar內(nèi)部的執(zhí)行語(yǔ)句為
console.log(a,b,c)
我們前面已經(jīng)說(shuō)過(guò),bar作用域中只有變量c,那么上述語(yǔ)句是否會(huì)出現(xiàn)錯(cuò)誤呢,答案是不會(huì)。上述代碼會(huì)正常輸出。那么為什么會(huì)這樣呢?答案就是代碼在運(yùn)行的過(guò)程中有一個(gè)作用域鏈能作用域給串起來(lái)。如下圖

內(nèi)部的作用域可以訪問(wèn)外部作用域的變量。所以bar函數(shù)在執(zhí)行console.log(a,b,c)時(shí),在當(dāng)前作用域中如果沒(méi)有找到a,b變量,它會(huì)順著作用域鏈往上找,在上層作用域foo中找到了a,b變量,它就會(huì)使用上層作用域a,b的值。如果上層作用域還是沒(méi)有a,b的話,它會(huì)順著作用域繼續(xù)查找,直到全局變量。如果全局變量仍然沒(méi)有,程序就會(huì)報(bào)錯(cuò)。那么既然內(nèi)部作用域能沿著作用域鏈訪問(wèn)到外部作用域,那么外部作用域能不能順著作用域鏈訪問(wèn)內(nèi)部作用域呢?不急,繼續(xù)看下面代碼。
執(zhí)行完bar函數(shù)后,bar函數(shù)從執(zhí)行棧中彈出,繼續(xù)執(zhí)行foo函數(shù)剩余的語(yǔ)句,console.log(c)
由于當(dāng)前作用域中不存在變量c,但是其子作用域內(nèi)有變量c的定義,那么程序會(huì)不會(huì)輸出子級(jí)作用域的變量c呢?答案是不會(huì)。
上級(jí)作用域不能通過(guò)作用鏈進(jìn)入下級(jí)作用域。只有下級(jí)作用域能通過(guò)作用鏈進(jìn)入上級(jí)作用域。只就是作用域的有序性。有序的訪問(wèn)所有能訪問(wèn)的變量和函數(shù)。

三 總結(jié)

作用域就像一個(gè)一個(gè)封閉的空間,不同作用域內(nèi)的變量是不會(huì)相互影響的。但是作用域之間又會(huì)有聯(lián)系。如果是嵌套的作用域的話,這些嵌套作用域會(huì)通過(guò)作用域鏈把嵌套作用域聯(lián)系在一起。內(nèi)部作用域能通過(guò)作用域鏈訪問(wèn)到上級(jí)作用域的變量。即如果當(dāng)前作用域中沒(méi)有某個(gè)變量,引擎會(huì)通過(guò)作用域鏈查找上級(jí)作用域看看有沒(méi)有定義該變量。直到全局作用域。(全局沒(méi)有則報(bào)錯(cuò))
但是上級(jí)作用域沒(méi)法通過(guò)作用域鏈訪問(wèn)下級(jí)作用域。這就是作用域的有序性。通過(guò)作用域鏈能讓引擎對(duì)執(zhí)行環(huán)境里所有有權(quán)訪問(wèn)的變量和函數(shù)進(jìn)行有序訪問(wèn)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/84441.html

相關(guān)文章

  • 談?wù)?em>javascript語(yǔ)法里一些難點(diǎn)問(wèn)題(二)

    摘要:講作用域鏈?zhǔn)紫纫獜淖饔糜蛑v起,下面是百度百科里對(duì)作用域的定義作用域在許多程序設(shè)計(jì)語(yǔ)言中非常重要。原文出處談?wù)務(wù)Z法里一些難點(diǎn)問(wèn)題二 3) 作用域鏈相關(guān)的問(wèn)題 作用域鏈?zhǔn)莏avascript語(yǔ)言里非常紅的概念,很多學(xué)習(xí)和使用javascript語(yǔ)言的程序員都知道作用域鏈?zhǔn)抢斫鈐avascript里很重要的一些概念的關(guān)鍵,這些概念包括this指針,閉包等等,它非常紅的另一個(gè)重要原因就...

    Enlightenment 評(píng)論0 收藏0
  • javascript中執(zhí)行環(huán)境及作用域的理解

    摘要:作用域鏈的用途,是保證對(duì)執(zhí)行環(huán)境有權(quán)訪問(wèn)的所有變量和函數(shù)的有序訪問(wèn)。這樣,一直延續(xù)到全局執(zhí)行環(huán)境全局執(zhí)行環(huán)境的變量對(duì)象始終都是作用域鏈中的最后一個(gè)對(duì)象。標(biāo)識(shí)符解析是沿著作用域鏈一級(jí)一級(jí)地搜索標(biāo)識(shí)符的過(guò)程。 執(zhí)行環(huán)境(execution context,為簡(jiǎn)單起見(jiàn),有時(shí)也成為環(huán)境)是javascript中最為重要的一個(gè)概念。執(zhí)行環(huán)境定義了變量或函數(shù)有權(quán)訪問(wèn)的其他數(shù)據(jù),決定了它們各自...

    BearyChat 評(píng)論0 收藏0
  • JavaScript閉包(三)

    摘要:目錄執(zhí)行環(huán)境與作用域鏈立即執(zhí)行函數(shù)閉包知識(shí)點(diǎn)什么是閉包使用閉包的意義與注意點(diǎn)閉包的具體應(yīng)用小結(jié)這是基本語(yǔ)法的函數(shù)部分的第篇文章,主要講述了中比較重要的知識(shí)點(diǎn)閉包在講閉包之前,在上一篇函數(shù)二的基礎(chǔ)上,進(jìn)一步深化執(zhí)行環(huán)境和作用域鏈的知識(shí)點(diǎn),并補(bǔ) 目錄 1.執(zhí)行環(huán)境與作用域鏈 2. 立即執(zhí)行函數(shù) 3. 閉包知識(shí)點(diǎn) 3.1 什么是閉包 3.2 使用閉包的意義與注意點(diǎn) 3.3 閉包的具體應(yīng)用 4...

    Anonymous1 評(píng)論0 收藏0
  • javascript的執(zhí)行環(huán)境和作用域的理解1

    摘要:執(zhí)行環(huán)境又稱(chēng)作執(zhí)行上下文,其作用就是規(guī)定了對(duì)環(huán)境內(nèi)的變量還有函數(shù)的操作權(quán)利,主要分為全局的執(zhí)行環(huán)境和局部的執(zhí)行環(huán)境。創(chuàng)建作用域鏈的作用主要是讓每個(gè)嵌套關(guān)聯(lián)的執(zhí)行環(huán)境中的變量和函數(shù)有序的調(diào)用和操作。 1 執(zhí)行環(huán)境(exeution context)又稱(chēng)作執(zhí)行上下文,其作用就是規(guī)定了對(duì)環(huán)境內(nèi)的變量還有函數(shù)的操作權(quán)利,主要分為全局的執(zhí)行環(huán)境和局部的執(zhí)行環(huán)境。 2 當(dāng)一段代碼進(jìn)行運(yùn)行的時(shí)候...

    Raaabbit 評(píng)論0 收藏0
  • javascript作用域,作用域鏈,[[scope]]屬性

    摘要:正式由于作用域鏈的這種關(guān)系,我們就不難理解,為什么和不能通過(guò)作用域鏈向上搜索,因?yàn)閷?duì)和的搜索在當(dāng)前執(zhí)行函數(shù)的活動(dòng)對(duì)象就停止了。 對(duì)于Javascript程序員來(lái)說(shuō),閉包總會(huì)讓你覺(jué)得既熟悉又陌生,然而它對(duì)于開(kāi)發(fā)人員來(lái)說(shuō)卻非常重要,javascript里的許多設(shè)計(jì)模式中都用到了閉包,此處以函數(shù)作用域?yàn)槔?//示例代碼 var a=1; function foo(){ ...

    pkhope 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<