作用域,變量的作用范圍

在ES6之前

變量的聲明

  只有var可以聲明變量屬于某個(gè)作用域,并且,也只有全局作用域和函數(shù)作用域。(沒有var聲明的變量,屬于全局作用域,在全局作用域里聲明的變量,函數(shù)會(huì)成為全局的屬性)

  所有的變量,不是全局作用域的,就是函數(shù)作用域的。

  如果用var 聲明變量,并且是在函數(shù)中,那么這個(gè)變量就屬于這個(gè)函數(shù),否則,屬于全局變量。

 

提升

  在JavaScript的任何一個(gè)作用域中,都存在提升;

        對(duì)于一個(gè)聲明var  a=2;引擎主要會(huì)分兩步走,var a;   a=2;  JS引擎進(jìn)行處理和執(zhí)行。

       所謂的處理,引擎首先會(huì)進(jìn)行全局的掃描,遇到變量的聲明(var 聲明的變量)就會(huì)記錄,遇到函數(shù)聲明(function 關(guān)鍵字開頭)也會(huì)進(jìn)行記錄,直到全局掃描完畢。然后,引擎開始從頭執(zhí)行,對(duì)變量進(jìn)行修改,對(duì)函數(shù)進(jìn)行調(diào)用。

      上邊所謂的記錄,就是提升行為。(如果學(xué)過C語(yǔ)言,就知道,函數(shù),變量都要先定義,在使用,否則會(huì)報(bào)錯(cuò),但是,js提升,可以理解為,不管你定義在哪里,都會(huì)被提升到使用的前面,也就是可以把使用寫在定義前面)

      引擎會(huì)把聲明的變量,函數(shù)聲明記錄到全局的作用域,記錄有哪些變量存在,并對(duì)變量進(jìn)行初始化賦值,undefined;為什么是記錄到全局,而不是對(duì)應(yīng)作用域,主要是因?yàn)椋婚_始掃描,就是掃描全局作用域,它只掃描一級(jí), 它不會(huì)深入掃描,只掃描表面。這個(gè)其實(shí)很好理解,除了變量的提升,還有函數(shù)聲明的提升,遇到function 關(guān)鍵字,js引擎只是簡(jiǎn)單的將其提升到最頂層,在全局作用域中定義的函數(shù),它作用域就相當(dāng)于二級(jí),js引擎是不會(huì)在這個(gè)時(shí)候去掃描函數(shù)作用域的。

  例如:

延伸閱讀

學(xué)習(xí)是年輕人改變自己的最好方式-Java培訓(xùn),做最負(fù)責(zé)任的教育,學(xué)習(xí)改變命運(yùn),軟件學(xué)習(xí),再就業(yè),大學(xué)生如何就業(yè),幫大學(xué)生找到好工作,lphotoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)學(xué)習(xí)是年輕人改變自己的最好方式

我想了解如何學(xué)習(xí)

姓名:
手機(jī):
留言:
 
<source id="ksqwe"></source>
<tbody id="ksqwe"></tbody>
<abbr id="ksqwe"></abbr>
    <option id="ksqwe"><bdo id="ksqwe"></bdo></option>
    <option id="ksqwe"><bdo id="ksqwe"></bdo></option>
  • <dd id="ksqwe"><del id="ksqwe"></del></dd>