上下文环境
##執行上下文環境
在一段JS真正運行之前瀏覽器已經做了一些準備工作:
????1.變量:變量的申明,默認值為undefined;
????2.this:賦值;
????3.函數申明:賦值
變量:
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}
函數聲明:
console.log(f1);??//functionf1(){}
function f1(){}????//函數申明
console.log(f2);???//undefined
var f2 = function (){}????//函數表達式
##函數中的變量
如果函數中出了以上數據外還有其他數據:
function fn(x){
????console.log(arguments);?????????????????[10]
????console.log(x);??????????????//----->????10
}
fn(10);
函數每被調用一次,都會產生一個新的執行上下文環境,因為不同的調用可能就會有不同的參數.
函數在定義的時候就確定了函數內部變量的作用域.
##執行上下文棧
執行全局代碼時會產生一個全局上下文環境,每次調用函數時又會產生一個函數上下文環境,當函數調用完成時,這個函數上下文環境以及其中的數據都會被銷毀,在重新回到全局上下文環境處于活動狀態的執行上下文環境只有一個.實際上,就是一個壓棧和出棧的過程.
var a = 10??//1.進入全局上下文環境
var fn = function(y){
????var c = 5;
????consolde.log(y + c);
};
var bar = function(x){
????var b = 5;
????fn(x + b);???//3.進入函數上下文環境
};
bar ();????//2.進入bar函數上下文環境
????????????????????????????????????
##作用域和執行上下文
作用域只是一個“地盤”,一個抽象的概念,其中沒有變量,要通過作用域對應的執行上下文環境來獲取變量的值,在同一作用域下,不同的調用會產生不同的執行上下文環境,繼而產生不同變量的值.
##自由變量
在A作用域中使用的變量x,卻沒有在A作用域中聲明(在其他作用域中聲明),對于A作用域來說x是一個自由變量.
var x = 10;
function(){
????console.log(x);??//x是自由變量
}
##作用域鏈
1.先在當前作用域中查找x,如果有則獲取并結束,如果沒有則繼續;
2.如果當前作用域是全局作用域,則證明x未定義,結束,否則繼續;
3.(不是全局作用域,就是函數作用域)將創建該函數的作用域作為當前作用域;
4.跳轉到第一步.
轉載于:https://www.cnblogs.com/lidongrain/p/4823831.html
總結
- 上一篇: 大数据初探——Hadoop历史
- 下一篇: 菜刀之中国蚁剑-安装使用及下载地址