作用域、作用域鏈

作用域

全局作用域 global

(1)最外層函數(shù)和在最外層函數(shù)外的變量擁有全局作用域

var i=1;
function a(){
var aw="qw";
console.log(aw);
function ba(){
var qq="aaa";
}
}

console.log(i);
condole.log(aw);
a();

//1
//Uncaght ReferenceError : aw is not defined(...)
//qw

(2)所有沒有聲明變量都自動聲明擁有全局作用域

function c(){
   o="qw";
 
   function ba(){
  p="aaa";
   }
ba();
   }
    c();
 
 console.log(o);
 console.log(p);

// qw
// aaa

(3)一般情況下,window下所有的屬性默認(rèn)擁有全局作用域,如:windows.onload,window.scroll等

局部作用域

與全局作用域相反,局部作用域只作用于某些代碼片段內(nèi),只在內(nèi)部可用

function ew(){
var e=2;
function q(){
var s=2,w=3;
console.log(s);
var d=s+w;
}
q();
console.log(d);
}
undefined
ew();
//  2
//  Uncaught ReferenceError: d is not defined(…)

作用域鏈

在JavaScript中,函數(shù)也是對象,實際上,JavaScript里一切都是對象。函數(shù)對象和其它對象一樣,擁有可以通過代碼訪問的屬性和一系列僅供JavaScript引擎訪問的內(nèi)部屬性。其中一個內(nèi)部屬性是[[Scope]],由ECMA-262標(biāo)準(zhǔn)第三版定義,該內(nèi)部屬性包含了函數(shù)被創(chuàng)建的作用域中對象的集合,這個集合被稱為函數(shù)的作用域鏈,它決定了哪些數(shù)據(jù)能被函數(shù)訪問。

function fo(){
 var a=3;
 }

這里函數(shù)文調(diào)用之前,作用域如圖

作用域鏈前

執(zhí)行此函數(shù)時會創(chuàng)建一個稱為“運行期上下文”的內(nèi)部對象,運行期上下文定義了函數(shù)執(zhí)行時的環(huán)境。每個運行期上下文都有自己的作用域鏈,用于標(biāo)識符解析,當(dāng)運行期上下文被創(chuàng)建時,而它的作用域鏈初始化為當(dāng)前運行函數(shù)的[[Scope]]所包含的對象。

這些值按照它們出現(xiàn)在函數(shù)中的順序被復(fù)制到運行期上下文的作用域鏈中。它們共同組成了一個新的對象,叫“活動對象”,該對象包含了函數(shù)的所有局部變量、命名參數(shù)、參數(shù)集合以及this,然后此對象會被推入作用域鏈的前端,當(dāng)運行期上下文被銷毀,活動對象也隨之銷毀。新的作用域鏈如下圖所示:

作用域鏈后
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容