閉包
函式被呼叫之后,會創建一個執行環境及作用域鏈.函式被執行完之后就會被釋放掉.
閉包函式執行之后會保留當前活動變數在內部函式作用域鏈中,所以內部函式可以訪問外部變數.
// 閉包
function test() {
let b = "b";
return () => b;
}
let t = test()
console.log(t()) // 訪問內部變數
示例一
列印出的結果是多少?
function test() {
var n = 4;
function add() {
n++;
console.log(n);
}
return { n: n, add: add };
}
var result = test(); // 返加一個物件
var result2 = test(); // 同上
result.add(); // 呼叫閉包函式,訪問內部變數. 輸出 5
result.add(); // 輸出 6
console.log(result.n); // 4
result2.add(); // 5
示例二
列印出的結果是什么?
function test() {
var arr = [];
for (var i = 0; i < 10; i++) {
arr[i] = function() {
console.log(i); // 輸出 10
};
}
return arr;
}
var myArr = test();
for (var j = 0; j < 10; j++) {
myArr[j]();
}
var宣告的變數只有函式作用域與全域作用域,這回圈中創建的i變數,會變數提升在函式頂部,所以函式列印i變數的值是10
示例三
列印出的結果是什么?
function test() {
var arr = [];
for (let i = 0; i < 10; i++) { // let
arr[i] = function() {
console.log(i);
};
}
return arr;
}
let myArr = test();
for (let j = 0; j < 10; j++) {
myArr[j](); // 輸出 0 到 9
}
let 宣告的變數具有塊級作用域,每輪回圈i變數,其時都是一個新的i變數,所以myArr陣列中存盤了不同的數字
示例四
列印結果是多少?
for (var i = 0; i < 10; i++) {
(j => {
setTimeout(function() {
console.log(j);// 0 ~ 9
}, 1000);
})(i); // 立即執行函式 傳參
}
這只是創建并執行了10個函式,每個函式都傳遞了個i變數給引數給j,j存盤了變數值,然后做為列印輸出了,所以結果為0~9
個人博客地址 : https://www.zhuamimi.cn
文章地址 : https://www.zhuamimi.cn/archives/208
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/147680.html
標籤:JavaScript
