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

資訊專(zhuān)欄INFORMATION COLUMN

JavaScript之變量對(duì)象

codeGoogle / 1172人閱讀

摘要:用偽代碼來(lái)表示函數(shù)未進(jìn)入執(zhí)行階段之前,變量對(duì)象中的屬性都不能訪(fǎng)問(wèn)但是進(jìn)入執(zhí)行階段之后,變量對(duì)象轉(zhuǎn)變?yōu)榱嘶顒?dòng)對(duì)象。全局上下文中,變量對(duì)象就是本身。函數(shù)上下文中,變量對(duì)象包括函數(shù)聲明,變量聲明。

概述

JavaScript 的可執(zhí)行代碼,具有執(zhí)行上下文,而每個(gè)上下文包括以下 3 個(gè)屬性:

變量對(duì)象(variable object, 簡(jiǎn)稱(chēng) VO)

作用域鏈(scope chain)

this

變量對(duì)象提供了當(dāng)前環(huán)境所需的變量和函數(shù)
作用域鏈用于保證 JS 中變量和函數(shù)有序地訪(fǎng)問(wèn)
this 為函數(shù)提供了執(zhí)行者對(duì)象

一個(gè)上下文的執(zhí)行周期可以用下圖示意:

本文就來(lái)介紹執(zhí)行上下文中的變量對(duì)象

那什么是變量對(duì)象呢?先看定義:

變量對(duì)象是與執(zhí)行上下文相關(guān)的數(shù)據(jù)作用域,用于存儲(chǔ)執(zhí)行上下文中的變量和函數(shù)聲明。

不同的執(zhí)行上下文,變量對(duì)象會(huì)有一些差別。接下來(lái)就分別針對(duì)不同的上下文討論其區(qū)別。

一、全局上下文
全局對(duì)象(Global object) 是在進(jìn)入任何執(zhí)行上下文之前就已經(jīng)創(chuàng)建了的對(duì)象;
這個(gè)對(duì)象只存在一份,它的屬性在程序中任何地方都可以訪(fǎng)問(wèn),全局對(duì)象的生命周期終止于程序退出那一刻。

在全局代碼的上下文執(zhí)行環(huán)境中,變量對(duì)象就是全局對(duì)象,在瀏覽器中,就是 window 對(duì)象。

此時(shí),我們可以用 this 和 self 來(lái)訪(fǎng)問(wèn)到全局對(duì)象,也就是它本身

console.log(this)  // window
console.log(self)  // window

其次,全局對(duì)象初始創(chuàng)建階段將 Math、String、Date、parseInt 等函數(shù)作為自身方法,還會(huì)把全局變量作為自己的屬性。

用偽代碼表示就是:

global = {
    Math: <...>
    Date: <...>
    window: global  // 引用自身
}
二、函數(shù)上下文

我們已經(jīng)知道,變量對(duì)象存儲(chǔ)量執(zhí)行上下文中的函數(shù)聲明和變量,在函數(shù)上下文中,多了 arguments(函數(shù)參數(shù)列表), 一個(gè)類(lèi)數(shù)組對(duì)象。

用偽代碼來(lái)表示:

VO = {
    arguments: Arguments,
    variables: undefine,
    functionName: 
}

函數(shù)未進(jìn)入執(zhí)行階段之前,變量對(duì)象中的屬性都不能訪(fǎng)問(wèn)!但是進(jìn)入執(zhí)行階段之后,變量對(duì)象轉(zhuǎn)變?yōu)榱嘶顒?dòng)對(duì)象(activation object)。

所以,在函數(shù)上下文中,我們將活動(dòng)對(duì)象(activation object)作為變量對(duì)象,活動(dòng)對(duì)象最開(kāi)始只包含一個(gè)變量就是 arguments 對(duì)象(這個(gè)對(duì)象是全局環(huán)境中沒(méi)有的)。

arguments 的屬性值 Arguments 它包括如下屬性:

callee — 誰(shuí)調(diào)用了本函數(shù)

length — 真正傳遞的參數(shù)個(gè)數(shù)

properties-indexes (字符串類(lèi)型的整數(shù)) 屬性的值就是函數(shù)的參數(shù)值(按參數(shù)列表從左到右排列)

三、創(chuàng)建過(guò)程

我們?cè)僖淮蝸?lái)看這個(gè)過(guò)程圖:

創(chuàng)建階段

全局對(duì)象初始化的時(shí)候,就將變量對(duì)象引用了自身。
而函數(shù)的創(chuàng)建卻有需要注意的地方。

函數(shù)在創(chuàng)建階段就創(chuàng)建了變量對(duì)象
其中,變量對(duì)象包括:

當(dāng)前函數(shù)的參數(shù)列表,建立 Arguments 對(duì)象。

所有的函數(shù)聲明(不包括函數(shù)表達(dá)式哦!),直接指向函數(shù)

所有的變量聲明(var 聲明的變量),默認(rèn)為 undefined

進(jìn)入執(zhí)行上下文時(shí),函數(shù)聲明和變量聲明都會(huì)提前,這就是聲明提升,但是變量聲明的值都是undefined,而函數(shù)聲明的變量已經(jīng)可以指向函數(shù)。變量聲明的優(yōu)先級(jí)最低。

看下面這段代碼:

function foo(a, b) {
  var c = 10;
  function d() {}
  var e = function _e() {};
  (function x() {});
}
  
foo(10); 

當(dāng)進(jìn)入函數(shù) foo 時(shí),其變量對(duì)象的表現(xiàn)形式為:

VO = {
    arguments: {
        0: 10,
        1: undefined,
        length: 1
    }
    c: undefined,
    d: ,
    e: undefined,
}

x 是函數(shù)表達(dá)式,所以不在變量對(duì)象當(dāng)中,e 變量引用的值也是函數(shù)表達(dá)式,所以變量 e 本身是聲明,所以在變量對(duì)象當(dāng)中。

執(zhí)行階段

當(dāng)前進(jìn)入執(zhí)行階段,變量對(duì)象激活成活動(dòng)對(duì)象,函數(shù)會(huì)順序執(zhí)行代碼,改變變量對(duì)象的值:
以上代碼就變成:

AO = {
    arguments: {
        0: 10,
        1: undefined,
        length: 1
    }
    c: 10,
    d: ,
    e: ,
}

接下來(lái)看一段代碼:

console.log(foo);

function foo() {
    console.log("123")
}

var foo = "456";

以上會(huì)打印函數(shù),是因?yàn)椋?/p>

變量?jī)?yōu)先處理函數(shù)聲明,再是變量聲明。

再看一段代碼:

if (true) {
  var a = 1;
} else {
  var b = 2;
}
console.log(a);  // 1
console.log(b);  // undefined

雖然 else 中的代碼永遠(yuǎn)不會(huì)被執(zhí)行,但是 b 的變量聲明在執(zhí)行之前就默認(rèn)被設(shè)置成 undefined了。

總結(jié)

執(zhí)行上下文包括三個(gè)屬性,變量對(duì)象,作用域鏈,this, 不同的執(zhí)行上下文,變量對(duì)象是有區(qū)別的。

全局上下文中,變量對(duì)象就是本身。

函數(shù)上下文中,變量對(duì)象包括:arguments, 函數(shù)聲明,變量聲明。在函數(shù)創(chuàng)建階段,變量對(duì)象有默認(rèn)值,進(jìn)入執(zhí)行階段后,變量對(duì)象會(huì)被激活成活動(dòng)對(duì)象,然后變量對(duì)象的值被順序改變。

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

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

相關(guān)文章

  • JavaScript 闖關(guān)記

    摘要:對(duì)象數(shù)組初始化表達(dá)式,闖關(guān)記之上文檔對(duì)象模型是針對(duì)和文檔的一個(gè)。闖關(guān)記之?dāng)?shù)組數(shù)組是值的有序集合。數(shù)組是動(dòng)態(tài)的,根闖關(guān)記之語(yǔ)法的語(yǔ)法大量借鑒了及其他類(lèi)語(yǔ)言如和的語(yǔ)法。 《JavaScript 闖關(guān)記》之 DOM(下) Element 類(lèi)型 除了 Document 類(lèi)型之外,Element 類(lèi)型就要算是 Web 編程中最常用的類(lèi)型了。Element 類(lèi)型用于表現(xiàn) XML 或 HTML 元素...

    mj 評(píng)論0 收藏0
  • JavaScript深入作用域鏈

    摘要:下面,讓我們以一個(gè)函數(shù)的創(chuàng)建和激活兩個(gè)時(shí)期來(lái)講解作用域鏈?zhǔn)侨绾蝿?chuàng)建和變化的。這時(shí)候執(zhí)行上下文的作用域鏈,我們命名為至此,作用域鏈創(chuàng)建完畢。 JavaScript深入系列第五篇,講述作用鏈的創(chuàng)建過(guò)程,最后結(jié)合著變量對(duì)象,執(zhí)行上下文棧,讓我們一起捋一捋函數(shù)創(chuàng)建和執(zhí)行的過(guò)程中到底發(fā)生了什么? 前言 在《JavaScript深入之執(zhí)行上下文棧》中講到,當(dāng)JavaScript代碼執(zhí)行一段可執(zhí)行代...

    waltr 評(píng)論0 收藏0
  • JavaScript深入變量對(duì)象

    摘要:深入系列第四篇,具體講解執(zhí)行上下文中的變量對(duì)象與活動(dòng)對(duì)象。下一篇文章深入之作用域鏈本文相關(guān)鏈接深入之執(zhí)行上下文棧深入系列深入系列目錄地址。 JavaScript深入系列第四篇,具體講解執(zhí)行上下文中的變量對(duì)象與活動(dòng)對(duì)象。全局上下文下的變量對(duì)象是什么?函數(shù)上下文下的活動(dòng)對(duì)象是如何分析和執(zhí)行的?還有兩個(gè)思考題幫你加深印象,快來(lái)看看吧! 前言 在上篇《JavaScript深入之執(zhí)行上下文棧》中...

    Zachary 評(píng)論0 收藏0
  • 【進(jìn)階1-2期】JavaScript深入執(zhí)行上下文棧和變量對(duì)象

    摘要:本計(jì)劃一共期,每期重點(diǎn)攻克一個(gè)面試重難點(diǎn),如果你還不了解本進(jìn)階計(jì)劃,點(diǎn)擊查看前端進(jìn)階的破冰之旅本期推薦文章深入之執(zhí)行上下文棧和深入之變量對(duì)象,由于微信不能訪(fǎng)問(wèn)外鏈,點(diǎn)擊閱讀原文就可以啦。 (關(guān)注福利,關(guān)注本公眾號(hào)回復(fù)[資料]領(lǐng)取優(yōu)質(zhì)前端視頻,包括Vue、React、Node源碼和實(shí)戰(zhàn)、面試指導(dǎo)) 本周正式開(kāi)始前端進(jìn)階的第一期,本周的主題是調(diào)用堆棧,今天是第二天。 本計(jì)劃一共28期,每期...

    Richard_Gao 評(píng)論0 收藏0
  • JavaScript深入執(zhí)行上下文

    摘要:深入系列第七篇,結(jié)合之前所講的四篇文章,以權(quán)威指南的為例,具體講解當(dāng)函數(shù)執(zhí)行的時(shí)候,執(zhí)行上下文棧變量對(duì)象作用域鏈?zhǔn)侨绾巫兓摹G把栽谏钊胫畧?zhí)行上下文棧中講到,當(dāng)代碼執(zhí)行一段可執(zhí)行代碼時(shí),會(huì)創(chuàng)建對(duì)應(yīng)的執(zhí)行上下文。 JavaScript深入系列第七篇,結(jié)合之前所講的四篇文章,以權(quán)威指南的demo為例,具體講解當(dāng)函數(shù)執(zhí)行的時(shí)候,執(zhí)行上下文棧、變量對(duì)象、作用域鏈?zhǔn)侨绾巫兓摹?前言 在《Jav...

    gougoujiang 評(píng)論0 收藏0
  • 談?wù)?em>javascript語(yǔ)法里一些難點(diǎn)問(wèn)題(一)

    摘要:引子前不久我建立的技術(shù)群里一位問(wèn)了一個(gè)這樣的問(wèn)題,她貼出的代碼如下所示執(zhí)行結(jié)果如下所示第一個(gè)第二個(gè)這是一個(gè)令人詫異的結(jié)果,為什么第一個(gè)彈出框顯示的是,而不是呢這種疑惑的原理我描述如下一個(gè)頁(yè)面里直接定義在標(biāo)簽下的變量是全局變量即屬于對(duì)象的變量 1) 引子 前不久我建立的技術(shù)群里一位MM問(wèn)了一個(gè)這樣的問(wèn)題,她貼出的代碼如下所示: var a = 1; function hehe...

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

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

0條評(píng)論

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