函数被调用以后,会建立一个执行环境及做用域链.函数被执行完以后就会被释放掉.
闭包函数执行以后会保留当前活动变量在内部函数做用域链中,因此内部函数能够访问外部变量.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~9
ip
我的博客地址 : https://www.zhuamimi.cn
文章地址 : https://www.zhuamimi.cn/archives/208作用域