专栏首页牛客网知识总结:四个例子理解闭包//例一//例二//例三//例四

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

/**

* 闭包原理

* @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 条评论
登录 后参与评论

相关文章

  • CVTE实习生面经

    3月8号面试,地点在希尔顿酒店二楼,12点多赶到后扫码排队,我是下午的第二个,但是等了很长时间,期间CVTE这边还提供了菜盒子(很精致的那种),等待期间和周围的...

    牛客网
  • 谷歌,微软,阿里,美团实习生面经

    牛客网
  • 从暑假到现在的一点感悟

    从4月底放假回国,做了个实习,参与了秋招,也算是小有感悟,趁着周末分享下。以下对公司的一些评价和感悟全是个人看法,每个人遇到的面试官和HR都不一样,大家都佛系一...

    牛客网
  • 从零开始学 Web 之 JavaScript(三)函数

    全局变量:在 script 使用 var 定义的变量(所有的 script 共享其全局性,js 里面没有块级作用域概念,只有全局作用域和局部作用域)。

    Daotin
  • JavaScript解析机制之变量提升

    在当前作用域下,JS 运行之前,会把带有 var 和 function 关键字的事先声明,并在内存中安排好。(这个过程也可以理解为变量提升)然后再从上到下执行 ...

    Leophen
  • 前端必备,25个最基本的JavaScript面试问题及答案

    1.使用 typeof bar === "object" 来确定 bar 是否是对象的潜在陷阱是什么?如何避免这个陷阱?

    用户5997198
  • JavaScript学习笔记007-js的执行

    Mr. 柳上原
  • 高阶函数和闭包

    函数也是一种数据类型,同样可以作为参数,传递给另外一个参数使用。最典型的就是作为回调函数。

    星辰_大海
  • 函数与作用域

    小胖
  • JavaScript(五):函数(闭包,eval)

    1.函数的申明:三种方法: function命令 函数表达式:变量赋值 Function构造函数 1 //method 1: function命令 2 fu...

    用户1149564

扫码关注云+社区

领取腾讯云代金券