找形參和變數宣告,將變數和形參作為ao屬性名,值為undefined
實參形參統一
函式體中找函式宣告,值賦為函式體
eg
function
fn(a)
console.
log(b)
;// undefined
var a =
123;
console.
log(a)
;//123
functiona(
) console.
log(a)
;//123
varb
=function()
console.
log(b)
;//function () {}
functiond(
)}fn(
1);//預編譯過程
// 1. 建立ao物件
// 2. ao
// 3. ao
// 4.ao
// b : undefined
// d : function d () {}
//之後開始執行函式
做一道題,先找go(全域性的) , 再找ao(自己的)
執行期上下文:當函式執行時,會建立乙個稱為執行期上下文的內部物件,函式執行就會產生執行期上下文(獨一無二的),執行完一次會銷毀一次。
[[scope]]:儲存作用域執行期上下文的集合。
[[scope]]中所儲存法人執行期上下文物件的集合,這個集合呈鏈式連線,我們把這種鏈式連線叫做作用域鏈。作用域鏈先將自己的ao放在第0位,然後才是go。
查詢變數:在哪個函式裡面查詢變數,就在這個函式的作用域鏈的頂端依次向下查詢。
舉個栗子
functiona(
)var a =
123;b(
);}var glob =
100;a(
);
剛開始的時候a被定義
此時a要被執行
b在開始時就在a的ao中
b在執行時會產生乙個屬於自己的ao,放在作用域鏈最頂端 0位。
當內部函式被儲存到外部時,將會生成閉包
閉包會導致原有作用域鏈不釋放,造成記憶體洩漏。
閉包的作用
functiona(
)var aaa =
124;
return b;
//形成閉包,執行之後銷毀a的 ao,但是b的沒有被銷毀
}var glob =
100;
var demo =a(
);//此時存的是b
demo()
;//124
首先當a定義
a執行完之後,把b存到外部了,a的ao被銷毀,但是b還存著a的ao
此時執行demo也就是執行b,找第0位,自己的ao中沒有aaa,找第一位,也就是之前a的ao,其中的aaa = 124,訪問這個aaa。
1.累加器
function
test()
functionb(
)return
[a,b]
;//a,b都和test產生閉包,一對二的關係
}var myarr =
test()
; myarr[0]
();//101
myarr[1]
();//100,在前乙個ao的基礎上減,因為共用乙個test產生的ao
具體講解如下
2.快取
function
eater()
, push :
function
(myfood)
}return obj;
}var eater1 =
eater()
; eater1.
push
('banana');
eater1.
eat();
//i am eating banana
執行完就被釋放,其餘和函式一樣基本結構
1.
(function()
())//建議使用第一種2.(
function())()
eg
(
function
abc()(
))//執行一次之後訪問abc會報錯,被銷毀了
只有表示式才能被執行
function
test()
()//這種不能被執行,這個叫函式宣告
能被執行符合執行的表示式的函式名會被自動忽略
var
test
=function()
();//可以執行,再次訪問test,返回undefined
立即執行函式舉例
var num =
(function
(a,b)(1
,2))
;
下次將深層次講解閉包和物件 作用域和閉包
給執行上下文環境下乙個通俗的定義 在執行 之前,把將要用到的所有的變數都事先拿出來,有的直接賦值了,有的先用undefined占個空。全域性 的上下文環境資料內容為 1 普通變數 包括函式表示式,如 var a 10 宣告 預設賦值為undefined 2 函式宣告 如 function fn 賦值...
作用域和閉包
題目 知識點 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...