給執行上下文環境下乙個通俗的定義——在執行**之前,把將要用到的所有的變數都事先拿出來,有的直接賦值了,有的先用undefined占個空。
全域性**的上下文環境資料內容為:
1、普通變數(包括函式表示式,如: var a = 10;):宣告(預設賦值為undefined)
2、函式宣告(如: function fn() ):賦值
3、this:賦值
如果**段是函式體,那麼在此基礎上需要附加:
1、引數:賦值
2、arguments:賦值
3、自由變數的取值作用域:賦值
範圍:一段標籤或者乙個函式
全域性(一段):變數定義、函式宣告
函式:變數定義、函式宣告、this、arguments(函式所有引數的集合)
函式宣告:function fn();
函式表示式:var fn = function();
console.log(a); //undefined
var a=100;
fn('zhangsan'); //'zhangsan' 20
function fn(name)
this要在執行時才能確認值,定義時無法確認
1、建構函式
如果函式作為建構函式用,那麼其中的this就代表它即將new出來的物件
function foo(name)
var f=new foo('zhangsan');//this===f
console.log(f.name);
2、函式作為物件的乙個屬性
如果函式作為物件的乙個屬性時,並且作為物件的乙個屬性被呼叫時,函式中的this指向該物件
var obj=
}obj.printname(); //this===obj
function fn1(name)
fn1.call(,'zhangsan',200); //this===
var fn2=function(name,age).bind(); this===
fn2('zhangsan',20);
4、全域性&呼叫普通函式
在全域性環境下,this永遠是window
匿名函式中this是window
function fn1()
fn1(); //this===window
js沒有塊級作用域,不受塊級限制,只有函式和全域性作用域;
js除了全域性作用域之外,只有函式可以建立的作用域;
作用域在函式定義時就已經確定了,而不是在函式呼叫時確定;
在宣告變數時,全域性**要在**前端宣告,函式中要在函式體一開始就宣告好。除了這兩個地方,其他地方都不要出現變數宣告。而且建議用「單var」形式;
作用域有上下級的關係,上下級關係的確定就看函式是在哪個作用域下建立的;
作用域最大的用處就是隔離變數,不同作用域下同名變數不會有衝突;
作用域只是乙個「地盤」,乙個抽象的概念,其中沒有變數。要通過作用域對應的執行上下文環境來獲取變數的值。同乙個作用域下,不同的呼叫會產生不同的執行上下文環境,繼而產生不同的變數的值。所以,作用域中變數的值是在執行過程中產生的確定的,而作用域卻是在函式建立時就確定了;
如果要查詢乙個作用域下某個變數的值,就需要找到這個作用域對應的執行上下文環境,再在其中尋找變數的值。
1、自由變數
在a作用域中使用的變數x,卻沒有在a作用域中宣告(即在其他作用域中宣告的),對於a作用域來說,x就是乙個自由變數
自由變數的取值:要到建立這個函式的那個作用域中取值——是「建立」,而不是「呼叫」————「靜態作用域」
var a=100;
function f1()
f2();
}f1();
2、作用域鏈
指取自由變數取值時的這個過程:(假設a是自由量)
1、先在當前作用域查詢a,如果有則獲取並結束。如果沒有則繼續;
2、如果當前作用域是全域性作用域,則證明a未定義,結束;否則繼續;
3、(不是全域性作用域,那就是函式作用域)將建立該函式的作用域作為當前作用域;
4、跳轉到第一步。閉包是指可以包含自由(未繫結到特定物件)變數的**塊,是能夠讀取其他函式內部變數的函式;這些變數不是在這個**塊內或者任何全域性上下文中定義的,而是在定義**塊的環境中定義(區域性變數),使用閉包會增加內容開銷。
1、函式作為返回值
function f1()
}//f1得到乙個函式
var f1=f1();
var a=200;
f1(); //100
2、函式作為引數傳遞function f1()
}var f1=f1();
function f2(fn)
f2(f1);//100
作用域和閉包
題目 知識點 1 執行上下文 2 this 3 作用域 4 作用域鏈 5 閉包 一 執行上下文 ps 函式宣告和函式表示式的區別 執行上下文 console.log a undefined var a 10 fn 張三 22 張三 22 function fn name 在script標籤內的全域性...
作用域和閉包
現有宣告後有賦值 宣告在編譯時會提公升位置,提公升時函式會優先變數,如果是同名函式順序排在後面的會覆蓋前面的函式 函式表示式 立即執行的函式表示式 var a 2 function iife global window 塊作用域和閉包 閉包 function foo return bar var b...
作用域 閉包
1.js執行順序 語法分析 預編譯 先生成go物件 1.函式執行生成ao物件 2.形參和變數作為ao物件的鍵名,鍵值是undefined 3.實參賦值給形參 4.在函式中找到函式宣告,把函式作為ao物件的屬性名,屬性值為函式體 執行js 作用域 變數作用範圍 1.作用域 變數作用範圍 1 函式作用域...