函式執行形成乙個私有作用域,函式執行完成,開成的這個棧記憶體一般情況下都會自動釋放
函式執行完成,當前私有作用哉(棧記憶體)中的某一部分內容被記憶體以外的其它東西(變數/元素的事件)占用了,當前的棧記憶體就不能釋放掉,也就形成了不銷毀的私有作用域(裡面的私有變數也不會銷毀)
函式內部可以訪問函式外部的變數,
函式外部不可以訪問函式內部的變數
當在函式外部定義乙個變數,變數在函式內部發生了變化,函式內部和外部都能訪問到這個變數
var a = 1;
function fn1()
fn1()
console.log(a) //2
fn():呼叫完函式,就會釋放棧記憶體
f(): 在函式外面有乙個變數接收了這個返回值,此時 當前作用域不能銷毀
function fn()
}var f = fn();
f(10); //11 正確:11,10+1=10,之後1為2,因為f(10),在函式fn()外面呼叫,故函式fn()裡的棧記憶體不銷毀,i一直存在
fn()(10); //12 正確:11 先執行fn(),之後再執行(10),即f(10),執行fn是重新把所有的流程執行一遍,臨時不銷毀,當返回結果執行完,沒有被占用了,就會釋放掉
f(20); //21 正確:22 //棧記憶體沒有銷毀,20+1
fn()(20); //22 正確:21 第二次執行fn是重新把所有的流程執行一遍,和第一次沒有任何直接的關係,20+2=22
function fn()
}var f = fn();
f(10); //11
f(20); //22
function fn()
}var f = fn();
fn()(10); //11
fn()(20); //21
function fn()
}var f = fn();
fn()(10); //11
f(20); //21
var i = 1;
function fn()
}var f = fn();
f(10); //11
fn()(10); //12
f(20); //23
fn()(20); //24
function fn(i)
//因為return,所以走不到這一hi
}var f = fn(10);
f(20); //30 正確:30
fn(10)(20); //31 正確:30
f(30); //40 正確:41
fn(20)(10); // 31 正確:30
f(40) //50 正確:52
作用域 閉包
1.js執行順序 語法分析 預編譯 先生成go物件 1.函式執行生成ao物件 2.形參和變數作為ao物件的鍵名,鍵值是undefined 3.實參賦值給形參 4.在函式中找到函式宣告,把函式作為ao物件的屬性名,屬性值為函式體 執行js 作用域 變數作用範圍 1.作用域 變數作用範圍 1 函式作用域...
閉包(2) 閉包的現象與作用
閉包的現象 當內部的函式被儲存在外部時,將會生成閉包。閉包會導致原有的作用域鏈不釋放,造成記憶體洩漏 占用的多了,剩下的就少了 閉包的作用 1.實現公用變數eg 函式累加器 function add return demo var counter add counter counter counte...
閉包 解決閉包問題
1 函式和對其周圍狀態 lexical environment,詞法環境 的引用 在一起構成閉包 closure 2 函式與函式所依賴的上下文環境組成閉包問題。3 閉包指的是 能夠訪問另乙個函式作用域的變數的函式。清晰的講 閉包就是乙個函式,這個函式能夠訪問其他函式的作用域中的變數。var arr ...