作用域和閉包

2021-08-09 07:42:37 字數 2523 閱讀 2759

給執行上下文環境下乙個通俗的定義——在執行**之前,把將要用到的所有的變數都事先拿出來,有的直接賦值了,有的先用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 函式作用域...