闭包原理及题型

闭包

函数被调用以后,会建立一个执行环境及做用域链.函数被执行完以后就会被释放掉.
闭包函数执行以后会保留当前活动变量在内部函数做用域链中,因此内部函数能够访问外部变量.javascript

// 闭包
function test() {
    let b = "b";
    return () => b;
}
let t = test()
console.log(t())  // 访问内部变量

示例一

打印出的结果是多少?java

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数组中存储了不一样的数字code

示例四

打印结果是多少?对象

for (var i = 0; i < 10; i++) {
    (j => {
        setTimeout(function() {
            console.log(j);// 0 ~ 9
        }, 1000);
    })(i); // 当即执行函数 传参
}

这只是建立并执行了10个函数,每一个函数都传递了个i变量给参数给j,j存储了变量值,而后作为打印输出了,因此结果为0~9ip

我的博客地址 : https://www.zhuamimi.cn
文章地址 : https://www.zhuamimi.cn/archives/208作用域

相关文章
相关标签/搜索