最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

實例詳解JavaScript靜態(tài)作用域和動態(tài)作用域

 更新時間:2021年10月25日 09:54:08   作者:戰(zhàn)場小包  
作用域是指程序源代碼中定義變量的區(qū)域,作用域規(guī)定了如何查找變量,也就是確定當(dāng)前執(zhí)行代碼對變量的訪問權(quán)限,這篇文章主要給大家介紹了關(guān)于JavaScript靜態(tài)作用域和動態(tài)作用域的相關(guān)資料,需要的朋友可以參考下

前言

在文章最開始,先學(xué)習(xí)幾個概念:

  • 作用域:《你不知道的js》中指出,作用域是一套規(guī)則,這套規(guī)則用來管理引擎如何在當(dāng)前作用域以及嵌套的子作用域中根據(jù)標(biāo)識符名稱進行變量查找。簡單來說,作用域規(guī)定了如何查找變量。
  • 靜態(tài)作用域:又稱詞法作用域,函數(shù)的作用域在函數(shù)定義的時候就決定了,通俗點說就是你在寫代碼時將變量和塊作用域?qū)懺谀睦餂Q定的。
  • 動態(tài)作用域:函數(shù)的作用域在函數(shù)調(diào)用時才決定的。

靜態(tài)作用域與動態(tài)作用域

JavaScript采用的是靜態(tài)作用域,函數(shù)定義的位置就決定了函數(shù)的作用域。

具體看一個例子,理解一下什么是靜態(tài)作用域與動態(tài)作用域的區(qū)別

var val = 1;
function test() {
    console.log(val);
}
function bar() {
    var val = 2;
    test();
}

bar();
// 結(jié)果是???

上面代碼中:

  • 我們首先定義全局變量 val,賦值為 1
  • 聲明一個函數(shù) text,函數(shù)的功能是打印 val 這個變量的值
  • 聲明一個函數(shù) bar,函數(shù)內(nèi)部定義局部變量 val,賦值為 2;并且函數(shù)內(nèi)部執(zhí)行 test() 函數(shù)
  • 執(zhí)行 bar() 函數(shù)

靜態(tài)作用域執(zhí)行過程

當(dāng)執(zhí)行 test 函數(shù)時,先從 test 函數(shù)內(nèi)部查找是否有變量 val,如果沒有,就沿定義函數(shù)的位置,查找上一層的代碼,查找到全局變量 val ,其值為 1。

作用域查找始終從運行時所處的最內(nèi)層作用域開始查找,逐級向外查找,直到遇見第一個匹配的標(biāo)識符為止。

無論函數(shù)在哪里被調(diào)用,無論如何被調(diào)用,它的作用域只由函數(shù)定義所處的位置決定。

動態(tài)作用域執(zhí)行過程

執(zhí)行 test 函數(shù),首先從函數(shù)內(nèi)部查詢 val 變量,如果沒有,就從調(diào)用函數(shù)的作用域,即 bar 函數(shù)的作用域內(nèi)部查找變量 val,所以打印結(jié)果 2

習(xí)題

我們來看三個習(xí)題,好好消化理解一下靜態(tài)作用域: 函數(shù)定義位置就決定了作用域。

習(xí)題一

var a = 1
function fn1(){
    function fn3(){
        var a = 4
        fn2()
    }
    var a = 2
    return fn3
}
function fn2(){
    console.log(a)
}
var fn = fn1()
fn()

上面代碼中:

  • 我們首先定義全局變量 a,賦值為 1
  • 聲明一個函數(shù) fn1,函數(shù)的內(nèi)部分別聲明了函數(shù) fn3,定義局部變量 a,賦值為 2,返回值為 fn3 函數(shù)
  • fn3 函數(shù)內(nèi)部定義局部變量 a,賦值為 4,執(zhí)行 fn2()
  • 聲明函數(shù) fn2, 函數(shù)的功能是,打印 a 的值
  • fn 賦值為 fn1() 的返回值
  • 執(zhí)行 fn() (相當(dāng)于執(zhí)行 fn3 函數(shù))

做題之前,一定要理解 靜態(tài)作用域 的概念。該題 fn2 定義在全局上,當(dāng) fn2 中找不到變量 a 時,它會去全局中尋找,與 fn1 和 fn3 毫無關(guān)系,打印 1.

習(xí)題二

var a = 1
function fn1(){
    function fn2(){
        console.log(a)
    }
    function fn3(){
        var a = 4
        fn2()
    }
    var a = 2
    return fn3
}
var fn = fn1()
fn()

fn2 是定義在函數(shù) fn1 內(nèi)部,因此當(dāng) fn2 內(nèi)部沒有變量 a 時,它會去 fn1 中尋找,跟函數(shù) fn3 毫無關(guān)系,如果 fn1 中尋找不到,會到 fn1 定義的位置的上一層(全局)尋找,直至尋找到第一個匹配的標(biāo)識符。本題可以在 fn1 中找到變量 a,打印 2

習(xí)題三

var a = 1;
function fn1(){
    function fn3(){
        function fn2(){
            console.log(a)
        }
        var a;
        fn2()
        a = 4
    }
    var a = 2
    return fn3
}
var fn = fn1()
fn()

該題 fn2 定義在函數(shù) fn3 中,當(dāng) fn2 中找不到變量 a 時,會首先去 fn3 中查找,如果還查找不到,會到 fn1 中查找。本題可以在 fn3 中找到變量 a,但由于 fn2() 執(zhí)行時,a 未賦值,打印 undefined。

總結(jié)

關(guān)于JavaScript 的靜態(tài)作用域,我們只需要記住一句話:函數(shù)定義的位置就決定了函數(shù)的作用域,遇到題目時不要被別的代碼干擾到。

到此這篇關(guān)于JavaScript靜態(tài)作用域和動態(tài)作用域的文章就介紹到這了,更多相關(guān)JS靜態(tài)作用域和動態(tài)作用域內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 文件預(yù)覽PDF.js使用技巧示例總結(jié)

    文件預(yù)覽PDF.js使用技巧示例總結(jié)

    這篇文章主要為大家介紹了文件預(yù)覽PDF.js使用技巧示例總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • 小程序?qū)崿F(xiàn)輪播圖

    小程序?qū)崿F(xiàn)輪播圖

    這篇文章主要為大家詳細介紹了小程序?qū)崿F(xiàn)輪播圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • JavaScript實現(xiàn)添加及刪除事件的方法小結(jié)

    JavaScript實現(xiàn)添加及刪除事件的方法小結(jié)

    這篇文章主要介紹了JavaScript實現(xiàn)添加及刪除事件的方法,實例總結(jié)了javascript對事件的添加及刪除的技巧,涉及javascript事件綁定的方法及瀏覽器兼容的相關(guān)注意事項,需要的朋友可以參考下
    2015-08-08
  • 用cookies實現(xiàn)的可記憶的樣式切換效果代碼下載

    用cookies實現(xiàn)的可記憶的樣式切換效果代碼下載

    比較不錯的用cookies實現(xiàn)的可記憶的樣式切換效果,這個思路也在一定程序,方便客戶的長期使用。
    2007-12-12
  • 深入淺析JavaScript系列(13):This? Yes,this!

    深入淺析JavaScript系列(13):This? Yes,this!

    在這篇文章里,我們將討論跟執(zhí)行上下文直接相關(guān)的更多細節(jié)。討論的主題就是this關(guān)鍵字。實踐證明,這個主題很難,在不同執(zhí)行上下文中this的確定經(jīng)常會發(fā)生問題
    2016-01-01
  • js代碼實現(xiàn)的加入收藏效果并兼容主流瀏覽器

    js代碼實現(xiàn)的加入收藏效果并兼容主流瀏覽器

    這篇文章主要介紹了js代碼實現(xiàn)的加入收藏效果并兼容主流瀏覽器,需要的朋友可以參考下
    2014-06-06
  • javascript實現(xiàn)顯示和隱藏div方法匯總

    javascript實現(xiàn)顯示和隱藏div方法匯總

    本文章通過幾個簡單的實例告訴你如何來實例關(guān)于隱藏與顯示div層及關(guān)閉層與隱藏的區(qū)別分析哦,有需要的同學(xué)可以參考一下本文章。
    2015-08-08
  • JS刪除數(shù)組指定值常用方法詳解

    JS刪除數(shù)組指定值常用方法詳解

    這篇文章主要介紹了JS刪除數(shù)組指定值常用方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • JavaScript 應(yīng)用技巧集合[推薦]

    JavaScript 應(yīng)用技巧集合[推薦]

    前段時間我曾經(jīng)對JavaScript中的應(yīng)用技巧進行了收集和總結(jié)這里我將會對這些應(yīng)用技巧進行集中描述,如果你覺得遺漏了一些好用的應(yīng)用技巧,也請在留言中提出,我會及時更新到這篇文章中的。
    2009-08-08
  • 原生js添加一個或多個類名的方法分析

    原生js添加一個或多個類名的方法分析

    這篇文章主要介紹了原生js添加一個或多個類名的方法,結(jié)合實例形式分析了javascript針對頁面元素屬性動態(tài)操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2019-07-07

最新評論

阿鲁科尔沁旗| 台南县| 台北县| 临澧县| 固始县| 随州市| 社旗县| 无极县| 丹巴县| 闽侯县| 佛学| 临澧县| 延安市| 句容市| 东乌| 陆河县| 贡山| 进贤县| 丹棱县| 晋州市| 缙云县| 菏泽市| 南岸区| 资中县| 云龙县| 台中县| 治县。| 资源县| 来宾市| 海丰县| 永年县| 张家川| 神木县| 霍城县| 西乡县| 溧阳市| 达拉特旗| 五大连池市| 许昌市| 平潭县| 鄯善县|