上下文环境
##執(zhí)行上下文環(huán)境
在一段JS真正運(yùn)行之前瀏覽器已經(jīng)做了一些準(zhǔn)備工作:
????1.變量:變量的申明,默認(rèn)值為undefined;
????2.this:賦值;
????3.函數(shù)申明:賦值
變量:
console.log(a)??---> a is not undefined
console.log(a)-----> undefined????
var a?
console.log(a)-----> undefined????
var a = 10
this:
console.log(this)??--->window{top:window,window:wina}
函數(shù)聲明:
console.log(f1);??//functionf1(){}
function f1(){}????//函數(shù)申明
console.log(f2);???//undefined
var f2 = function (){}????//函數(shù)表達(dá)式
##函數(shù)中的變量
如果函數(shù)中出了以上數(shù)據(jù)外還有其他數(shù)據(jù):
function fn(x){
????console.log(arguments);?????????????????[10]
????console.log(x);??????????????//----->????10
}
fn(10);
函數(shù)每被調(diào)用一次,都會產(chǎn)生一個(gè)新的執(zhí)行上下文環(huán)境,因?yàn)椴煌恼{(diào)用可能就會有不同的參數(shù).
函數(shù)在定義的時(shí)候就確定了函數(shù)內(nèi)部變量的作用域.
##執(zhí)行上下文棧
執(zhí)行全局代碼時(shí)會產(chǎn)生一個(gè)全局上下文環(huán)境,每次調(diào)用函數(shù)時(shí)又會產(chǎn)生一個(gè)函數(shù)上下文環(huán)境,當(dāng)函數(shù)調(diào)用完成時(shí),這個(gè)函數(shù)上下文環(huán)境以及其中的數(shù)據(jù)都會被銷毀,在重新回到全局上下文環(huán)境處于活動狀態(tài)的執(zhí)行上下文環(huán)境只有一個(gè).實(shí)際上,就是一個(gè)壓棧和出棧的過程.
var a = 10??//1.進(jìn)入全局上下文環(huán)境
var fn = function(y){
????var c = 5;
????consolde.log(y + c);
};
var bar = function(x){
????var b = 5;
????fn(x + b);???//3.進(jìn)入函數(shù)上下文環(huán)境
};
bar ();????//2.進(jìn)入bar函數(shù)上下文環(huán)境
????????????????????????????????????
##作用域和執(zhí)行上下文
作用域只是一個(gè)“地盤”,一個(gè)抽象的概念,其中沒有變量,要通過作用域?qū)?yīng)的執(zhí)行上下文環(huán)境來獲取變量的值,在同一作用域下,不同的調(diào)用會產(chǎn)生不同的執(zhí)行上下文環(huán)境,繼而產(chǎn)生不同變量的值.
##自由變量
在A作用域中使用的變量x,卻沒有在A作用域中聲明(在其他作用域中聲明),對于A作用域來說x是一個(gè)自由變量.
var x = 10;
function(){
????console.log(x);??//x是自由變量
}
##作用域鏈
1.先在當(dāng)前作用域中查找x,如果有則獲取并結(jié)束,如果沒有則繼續(xù);
2.如果當(dāng)前作用域是全局作用域,則證明x未定義,結(jié)束,否則繼續(xù);
3.(不是全局作用域,就是函數(shù)作用域)將創(chuàng)建該函數(shù)的作用域作為當(dāng)前作用域;
4.跳轉(zhuǎn)到第一步.
轉(zhuǎn)載于:https://www.cnblogs.com/lidongrain/p/4823831.html
總結(jié)
- 上一篇: 大数据初探——Hadoop历史
- 下一篇: 博客诞生过程与变革:十年来谁是写博客第一