知识总结:四个例子理解闭包//例一//例二//例三//例四

/**

* 闭包原理

* @date   2017-04-10 14:04:17

* @version 1

*/

//理解作用域、作用域链

//内部作用域可以通过作用域链引用外部作用域的变量

// function(){}() functionName() 立即执行函数

//例一

function exp1() {

var a = 1;

var b = function() {

//console.log(0);//exp1函数被调用的时候,0不会输出;b函数被调用时,0才输出。

console.log(a);

};//b是函数,被调用的时候输出才执行,通过作用域链找到a值。

a = a + 3;

return b;

}

var res1 = exp1(); //[function]

res1();//调用函数执行输出,a值已经被修改为4

console.log('------------------------');

//本质:exp1函数已执行完,b函数才被调用。

//例二

function exp2() {

var a = 1;

var b = function() {

console.log(a);

}(); //b是数值,匿名函数立即执行输出a值为1

a = a + 3;

return b;

}

var res2 = exp2(); //1

console.log('------------------------');

//例三

function exp3() {

var a = 1;

var b = function() {

return function(){

console.log(a);

};

}();  //再加一层闭包保持b是函数。外层匿名函数立即执行返回函数,b是函数,被调用的时候输出才执行,通过作用域链找到a值。

a = a + 3;

return b;

}

var res3 = exp3(); //[function]

res3();//调用函数执行输出,a值已经被修改为4

console.log('------------------------');

//例四

function exp4() {

var a = 1;

var b = function(num) {//参数num被赋值为1

return function(){

console.log(num);

};

}(a);//再加一层闭包保持b是函数,外层匿名函数传参立即执行。立即执行外层匿名函数返回函数,b是函数,被调用的时候输出才执行,通过作用域链找到num值。

a = a + 3;

return b;

}

var res4 = exp4(); //[function]

res4();//调用函数执行输出,num值为1

console.log('------------------------');

//拓展

function exp5() {

var b = [];

for (var i = 0; i < 4; i++) {

b[i] = function() {

console.log(i);

};

}

return b;

}

var res5 = exp5();

//[[function],[function],[function],[function]]

res5[1](); //4

console.log('------------------------');

function exp6() {

var b = [];

for (var i = 0; i < 4; i++) {

b[i] = function(num) {

return function(){

console.log(num);

};

}(i);

}

return b;

}

var res6 = exp6();

//[[function],[function],[function],[function]]

res6[1](); //1

本文来源于牛客网

作者:Mr.Apple

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏PHP在线

PHP函数

请点击上面蓝色PHP关注 你知道这些简单的函数中的方法吗? count() 函数计算数组中的单元数目或对象中的属性个数。 对于数组,返回其元素的个数,对于其他值...

2925
来自专栏前端知识分享

第203天:js---Array对象常用方法

912
来自专栏lzj_learn_note

1-python基础

​ 同一个变量a可以反复赋值,且可以是不同类型的变量. 这种变量本身类型不固定的语言称为动态语言, 比如python, javascript....

2492
来自专栏CaiRui

Python生成器和迭代器

 1、生成器  通过列表生成式,我们可以直接创建一个列表。但是,受到内存的限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占有很大的存储...

2025
来自专栏desperate633

LintCode 移动零题目分析

给一个数组 nums 写一个函数将0 移动到数组的最后面,非零元素保持原数组的顺序

792
来自专栏noteless

JavaSE之Long 详解 Long的方法简介以及用法

java.lang.Long.valueOf(String, int)是借助于parseLong进行转换

5282
来自专栏简书专栏

Python正则表达式re库的使用

re.search函数需要传入2个参数,第1个参数是正则表达式,第2个参数是要进行搜索的源字符串。 re.search函数返回结果的数据类型是sre.SRE_...

1772
来自专栏PHP实战技术

你应该这个姿势学习PHP(2)

1、循环数组有哪几种方式 1)foreach(能够循环关联和索引数组以及对象) 2)for(只能循环索引数组) 3)list和each配合使用循环数组 $arr...

27710
来自专栏python成长之路

列表常用操作

1764
来自专栏Java帮帮-微信公众号-技术文章全总结

第四天 数组【悟空教程】

2099

扫码关注云+社区

领取腾讯云代金券