国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

作用域和作用域鏈的相關(guān)知識(shí)

這篇具有很好參考價(jià)值的文章主要介紹了作用域和作用域鏈的相關(guān)知識(shí)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

作用域

作用域(scope)規(guī)定了變量能夠被訪問的“范圍”,離開了這個(gè)“范圍”變量便不能被訪問。
作用域分為:

  • 局部作用域
  • 全局作用域

局部作用域

局部作用域分為函數(shù)作用域和塊作用域。

函數(shù)作用域

在函數(shù)內(nèi)部聲明的變量只能在函數(shù)內(nèi)被訪問,外部無(wú)法直接訪問。

function foo(){
    const bar = 1;
}

console.log(bar); // ReferenceError: bar is not defined

總結(jié)

  • 函數(shù)內(nèi)部聲明的變量,在函數(shù)外部無(wú)法被訪問;
  • 函數(shù)的參數(shù)也是函數(shù)內(nèi)部的局部變量;
  • 不同函數(shù)內(nèi)部聲明的變量無(wú)法互相訪問;
  • 函數(shù)執(zhí)行完畢后,函數(shù)內(nèi)部的變量實(shí)際被清空了。

塊作用域

在JavaScript中使用{}包裹的代碼稱為代碼塊,代碼塊內(nèi)部聲明的變量外部將有可能無(wú)法被訪問。

有可能:取決于使用let還是var。

for (let i=1; i<=5; i++){
    // i 只能在該代碼塊中被訪問
    console.log(i); // 正常
}

// 超出了 i 的作用域
console.log(i); // 報(bào)錯(cuò)
for (var i=1; i<=5; i++){
    // i 能在該代碼塊中被訪問
    console.log(i); // 正常
}

// 超出了 i 的作用域
console.log(i); // 不會(huì)報(bào)錯(cuò),因?yàn)?i 是使用var聲明的

總結(jié)

  • let聲明的變量會(huì)產(chǎn)生塊作用域,var不會(huì)產(chǎn)生塊作用域;
  • const聲明的常量也會(huì)產(chǎn)生塊作用域;
  • 不同代碼塊之間的變量無(wú)法互相訪問;
  • 推薦使用let或const。

全局作用域

<script>標(biāo)簽和.js文件的最外層就是所謂的全局作用域,在此聲明的變量在函數(shù)內(nèi)部也可以被訪問。
全局作用域中聲明的變量,任何其它作用域都可以被訪問。

注意文章來源地址http://www.zghlxwxcb.cn/news/detail-709923.html

  • 為window對(duì)象動(dòng)態(tài)添加的屬性默認(rèn)也是全局的,不推薦!
  • 函數(shù)中未使用任何關(guān)鍵字聲明的變量為全局變量,不推薦?。?/li>
  • 盡可能少的聲明全局變量,防止全局變量被污染。

作用域鏈

作用域鏈本質(zhì)上是底層的變量查找機(jī)制。

  • 在函數(shù)被執(zhí)行時(shí),會(huì)優(yōu)先查找當(dāng)前函數(shù)作用域中查找變量;
  • 如果當(dāng)前作用域查找不到則會(huì)依次逐級(jí)查找父級(jí)作用域直到全局作用域。

總結(jié)

  • 嵌套關(guān)系的作用域串聯(lián)起來形成了作用域鏈
  • 相同作用域鏈中按著從小到大的規(guī)則查找變量
  • 子作用域能夠訪問父作用域,父級(jí)作用域無(wú)法訪問子級(jí)作用域

垃圾回收機(jī)制

內(nèi)存的生命周期

JS環(huán)境中分配的內(nèi)存,一般有如下生命周期

  1. 內(nèi)存分配:當(dāng)我們聲明變量、函數(shù)、對(duì)象的時(shí)候,系統(tǒng)會(huì)自動(dòng)為他們分配內(nèi)存
  2. 內(nèi)存使用:即讀寫內(nèi)存,也就是使用變量、函數(shù)等
  3. 內(nèi)存回收:使用完畢,由垃圾回收器自動(dòng)回收不再使用的內(nèi)存
// 為變量分配內(nèi)存
const num = 10;

// 為對(duì)象分配內(nèi)存
const obj = {
    num: 10
}

// 為函數(shù)分配內(nèi)存
function fn(){
    const num = 10;
    console.log(num);
}

說明

  • 全局變量一般不會(huì)回收(關(guān)閉頁(yè)面回收)
  • 一般情況下局部變量的值,不用了,會(huì)被自動(dòng)回收

內(nèi)存泄漏:程序中分配的內(nèi)存由于某種原因程序未釋放無(wú)法釋放叫做內(nèi)存泄漏。

算法說明

這一部分介紹JS引擎是如何回收內(nèi)存的。

復(fù)習(xí)

堆??臻g分配區(qū)別:

  1. 棧(操作系統(tǒng)):由操作系統(tǒng)自動(dòng)分配釋放函數(shù)的參數(shù)值、局部變量等,基本數(shù)據(jù)類型放到棧里面。
  2. 堆(操作系統(tǒng)):一般由程序員分配釋放,若程序員不釋放,由垃圾回收機(jī)制回收。復(fù)雜數(shù)據(jù)類型放到堆里面。

下面介紹兩種常見的瀏覽器垃圾回收算法引用計(jì)數(shù)法標(biāo)記清除法。

引用計(jì)數(shù)法

IE采用的引用計(jì)數(shù)算法,定義“內(nèi)存不再使用”,就是看一個(gè)對(duì)象是否有指向它的引用,沒有引用了就回收對(duì)象
算法

  1. 跟蹤記錄被引用的次數(shù);
  2. 如果被引用了一次,那么就記錄次數(shù)1,多次引用會(huì)累加;
  3. 如果減少一個(gè)引用就減1
  4. 如果引用次數(shù)是0,則釋放內(nèi)存。

引用計(jì)數(shù)算法是個(gè)簡(jiǎn)單有效的算法,但是現(xiàn)在已經(jīng)很少使用,因?yàn)樗嬖谝粋€(gè)致命的問題:嵌套引用(循環(huán)引用)

如果兩個(gè)對(duì)象相互引用,盡管他們已不再使用,垃圾回收器不會(huì)進(jìn)行回收,導(dǎo)致內(nèi)存泄漏。

function fn(){
    let o1 = {}
    let o2 = {}
    o1.a = o2
    o2.a = o1
    return '引用計(jì)數(shù)無(wú)法回收'
}
fn()

如上圖,函數(shù)執(zhí)行結(jié)束后,局部變量都被取消,但是由于對(duì)象相互引用,內(nèi)存無(wú)法被回收。

并且,每執(zhí)行一次函數(shù),就會(huì)導(dǎo)致一次內(nèi)存泄漏。

標(biāo)記清除法

現(xiàn)代的瀏覽器已經(jīng)不再使用引用計(jì)數(shù)算法了。
現(xiàn)代瀏覽器通用的大多是基于標(biāo)記清除算法的某些改進(jìn)算法,總體思想都是一致的。
核心

  1. 標(biāo)記清除算法將“不再使用的對(duì)象”定義為“無(wú)法達(dá)到的對(duì)象”。
  2. 就是從根部(在S中就是全局對(duì)象)出發(fā)定時(shí)掃描內(nèi)存中的對(duì)象。凡是能從根部到達(dá)的對(duì)象,都是還需要使用的。
  3. 那些無(wú)法由根部出發(fā)觸及到的對(duì)象被標(biāo)記為不再使用,稍后進(jìn)行回收

如圖,標(biāo)記清除法可以解決引用計(jì)數(shù)法無(wú)法解決的相互引用的問題。

閉包

概念:一個(gè)函數(shù)對(duì)周圍狀態(tài)的引用捆綁在一起,內(nèi)層函數(shù)中訪問到其外層函數(shù)的作用域
簡(jiǎn)單理解:閉包 = 內(nèi)層函數(shù) + 外層函數(shù)的變量

function outer(){
    const num = 10;
    function fn(){
        console.log(num);
    }
    fn();
}
outer(); // 10

內(nèi)函數(shù)fn使用了外函數(shù)的變量num,形成閉包。

另一個(gè)例子:統(tǒng)計(jì)函數(shù)調(diào)用次數(shù),函數(shù)調(diào)用一次,就加1。

function counter(){
    let num = 0;
    return function(){
        console.log(num++);
    }
}

const add = counter();
add(); // 0
add(); // 1
add(); // 2

閉包作用:封閉數(shù)據(jù),提供操作,外部也可以訪問函數(shù)內(nèi)部的變量。

閉包應(yīng)用:實(shí)現(xiàn)數(shù)據(jù)的私有。

變量提升

變量提升是JavaScript中比較“奇怪”的現(xiàn)象,它允許在變量聲明之前即被訪問(僅存在于var聲明變量)

console.log(num); // undefined
var num = 10;

在這個(gè)案例中,使用var聲明的num會(huì)存在變量提升的現(xiàn)象。提前輸出不會(huì)報(bào)錯(cuò),是因?yàn)檫@個(gè)變量已經(jīng)聲明了。雖然聲明會(huì)被提升,但是賦值操作不會(huì)被提升,所以num還是undefined。

注意

  1. 變量在未聲明即被訪問時(shí)會(huì)報(bào)語(yǔ)法錯(cuò)誤;
  2. 變量在var聲明之前即被訪問,變量的值為undefined;
  3. let/const聲明的變量不存在變量提升;
  4. 變量提升出現(xiàn)在相同作用域當(dāng)中;
  5. 實(shí)際開發(fā)中推薦先聲明再訪問變量。

到了這里,關(guān)于作用域和作用域鏈的相關(guān)知識(shí)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 深入理解作用域、作用域鏈和閉包

    深入理解作用域、作用域鏈和閉包

    ?? ?? 岸邊的 風(fēng) :個(gè)人主頁(yè) ???? 個(gè)人專欄? :《 VUE 》?《 javaScript 》 ??? 生活的理想,就是為了理想的生活?! ? 目錄 ????前言 ????1. 詞法作用域 ?? 1.2 示例 ?? 1.3 詞法作用域的應(yīng)用場(chǎng)景 ????2. 作用域鏈 ?? 2.1 概念 ?? 2.2 示例 ?? 2.3 作用域鏈的應(yīng)用場(chǎng)景 ???

    2024年02月10日
    瀏覽(23)
  • JS面試題:說一下什么是作用域、作用域鏈?

    說一下執(zhí)行上下文的理解? ? ? 在 代碼執(zhí)行前 產(chǎn)生 ? ? 產(chǎn)生變量提升、函數(shù)提升的原因 ? ? 定義: ? ? ? ? 全局執(zhí)行上下文對(duì)象:在執(zhí)行全局代碼前,創(chuàng)建對(duì)應(yīng)的全局執(zhí)行上下文對(duì)象,即window對(duì)象,進(jìn)行預(yù)處理 ? ? ? ? 函數(shù)執(zhí)行上下文對(duì)象:在調(diào)用函數(shù)后、準(zhǔn)備執(zhí)行函數(shù)

    2024年01月25日
    瀏覽(21)
  • C語(yǔ)言變量的作用域,生命周期和鏈接相關(guān)

    本文介紹C語(yǔ)言的三個(gè)很重要的概念: 變量的作用域 變量的生命周期 變量或者函數(shù)的鏈接 先介紹一個(gè)概念: 翻譯單元 C語(yǔ)言中有兩種文件, 頭文件.h , 代碼文件.c 翻譯單元指的是 包含頭文件,并且將頭文件展開以后的代碼文件.c ,而每個(gè)翻譯單元都有一個(gè) 文件作用域 ,實(shí)

    2024年02月04日
    瀏覽(28)
  • 【前端|Javascript第3篇】探秘JavaScript的作用域與作用域鏈:小白也能輕松搞懂!

    【前端|Javascript第3篇】探秘JavaScript的作用域與作用域鏈:小白也能輕松搞懂!

    大家好!歡迎來到本篇博客,今天我們將解開JavaScript編程世界中的一道神秘面紗:作用域與作用域鏈。很多Javascript開發(fā)者并不真正理解它們,但這些概念對(duì)掌握J(rèn)avascript至關(guān)重要。如果你對(duì)這些概念感到困惑,不要擔(dān)心!本文將以通俗易懂的方式,用趣味橫生的例子,為你詳

    2024年02月13日
    瀏覽(32)
  • 一、Go基礎(chǔ)知識(shí)2、iota、匿名變量與變量作用域的小細(xì)節(jié)

    1、iota是特殊常量,可以理解為是一個(gè)可被編譯器修改的常量。 2、iota中有一個(gè)計(jì)數(shù)器,會(huì)自動(dòng)加1,自增類型默認(rèn)是int類型。 3、如果中斷了iota則必須顯示恢復(fù)。參考示例二。 4、iota簡(jiǎn)化了const類型的定義。 5、每次出現(xiàn)const的時(shí)候,iota歸零。 示例一: 運(yùn)行結(jié)果: 兩個(gè)const打

    2024年02月05日
    瀏覽(23)
  • Javascript作用域 (局部作用域和全局作用域) 詳細(xì)介紹

    Javascript作用域 (局部作用域和全局作用域) 詳細(xì)介紹

    作用域是當(dāng)前的執(zhí)行上下文,值和表達(dá)式在其中“可見”或可被訪問。 常見的作用域?yàn)椋?全局作用域:腳本模式運(yùn)行所有代碼的默認(rèn)作用域 函數(shù)作用域:由函數(shù)創(chuàng)建的作用域 局部作用域:用對(duì)象{}包著(一個(gè)代碼塊)創(chuàng)建出來的作用域 在 了解作用域之前先看一下全局變量

    2024年02月08日
    瀏覽(35)
  • Bean作用域和生命周期

    Bean作用域和生命周期

    hi,今天為大家?guī)Ю睟ean的作用域和生命周期的相關(guān)知識(shí) Bean的作用域和我們之前學(xué)過的不一樣,我們之前學(xué)的作用域是一個(gè)范圍,而現(xiàn)在指的是 Bean在Spring框架中的某種行為模式,也就是一個(gè)動(dòng)作. 這樣干巴巴的說看我可能無(wú)法理解,我們來舉個(gè)例子 創(chuàng)建一個(gè)公共類的一個(gè)公共對(duì)象

    2024年02月15日
    瀏覽(33)
  • JavaScript(函數(shù),作用域和閉包)

    JavaScript(函數(shù),作用域和閉包)

    類似于Java中的方法,是完成特定任務(wù)的代碼語(yǔ)句塊 特點(diǎn) 使用更簡(jiǎn)單 不用定義屬于某個(gè)類,直接調(diào)用執(zhí)行 分類 系統(tǒng)函數(shù) 自定義函數(shù) 1.將字符串轉(zhuǎn)換為整型數(shù)字 js示例1 從下標(biāo)為0起,依次判斷每個(gè)字符是否可以轉(zhuǎn)換為一個(gè)有效數(shù)字 如果不是有效數(shù)字,則返回NaN,不再繼續(xù)執(zhí)

    2024年02月10日
    瀏覽(25)
  • Bean 作用域和生命周期

    Bean 作用域和生命周期

    Spring 容器是用來存儲(chǔ)和讀取 Bean 的 , 因此 Bean 是 Spring 中最核心的操作資源. 編寫代碼過程中 , bean 對(duì)象如果有多個(gè)屬性 , 創(chuàng)建 Getter , Setter, 構(gòu)造方法 等方法 , 會(huì)產(chǎn)生大量冗長(zhǎng)的代碼. 那么為了使代碼更加簡(jiǎn)潔 , 我們可以使用 Lombok 框架 , 只需要一行注釋 , 就可以避免大量冗長(zhǎng)

    2024年02月05日
    瀏覽(50)
  • 關(guān)于OC中變量相關(guān)知識(shí)點(diǎn)

    眾所周知,變量是用來存儲(chǔ)數(shù)據(jù)的 圍繞著變量,有很多知識(shí)點(diǎn),總結(jié)歸納一下 變量的類型 變量的作用區(qū)域 局部變量 全局變量 靜態(tài)變量 變量的訪問范圍 屬性 成員變量 實(shí)例變量 synthesize dynamic … 變量大致分為兩大類型: 基本數(shù)據(jù)類型 非基本數(shù)據(jù)類型(指針/對(duì)象/Class類型)

    2024年01月21日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包