js 闭包

/*

* [闭包]

* 》 函数执行形成一个私有的作用域,保护里面的私有变量不受外界的干扰,这种保护机制称之为”闭包“。

*

* =》市面上的开发者认为的闭包:形成一个不销毁的私有作用域(私有栈内存)才是闭包

*/

/*

// > 闭包: 柯理化函数

function fn(){

    return function(){

    }

}

var f = fn();*/

/*

// > 闭包:惰性函数

var utils = (function(){

    return {

    }

})(); */

// > 闭包项目实战应用

// ==> 真实项目为了保证js的性能(堆栈内存的性能优化),应该尽可能的减少闭包的使用(不销毁的堆栈内存是耗性能的)

// 1.闭包具有“保护”作用:保护私有变量不受外界的干扰

//> 在真是项目中,尤其是团队协作开发的时候,应当尽可能的减少全局变量的使用,以防止相互之间的冲突(“全局变量的污染”),那么此时我们完全可以把自己这一部分内容封装到一个闭包中,让全局变量转换为私有变量

/*

(function (){

    var n = 12;

    function fn(){

    }

})()

*/

//> 不仅如此,我们封装类库插件的时候,也会把自己的程序都存放到闭包中保护起来,防止和用户的程序冲突,但是我们有需要暴露一些方法给客户使用,这样我们如何处理呢?

// 1.jQ这种方式:把需要暴露的方法抛到全局

// (function (){

// function JQuery(){

// //..

// }

// window.JQuery = window.$ = JQuery;// =>把需要供外面使用的方法,通过WINDOWW设置属性的方式暴露出去

// })

// JQuery();

// $();

// 2.Zepto这种方式:基于RETURN把需要供外面使用的方法暴露出去

// var Zepto = (function (){

// // ...

// // return{

// xxx: function(){}

// }

// })()

// Zepto.xxx()

// 2.闭包具有"保存"作用:形成不销毁的栈内存,把一些值保存下来,方便后面的调取使用

// ### 选项卡案例

/*for(var i = 0;i<tabList.length;i++){

    tabList[i].onclick = function () {

    changeTab(i);

        // => 执行方法:形成一个私有的栈内存,遇到变量i,i不是私有变量,向上一级作用域查找(上级作用域WINDOW)

        // => 所有的事件绑定都是异步编程(同步编程:一件一件事的做,当前这件事没有完成,下一个任务不能处理 / 异步编程:当前这件事没有彻底完成,不在等待,继续执行下面的任务),绑定事件后不需要等待执行,继续执行下一个循环任务,所有当我们单机执行方法的时候,循环早已经结束(让结束i等于循环最后的结果)

    }

}*/

/*// =》 解决方案自定义属性

for(var i = 0;i<tabList.length;i++){

    tabList[i].myIndex = i

    tabList[i].onclick = function () {

        changeTab(this.myIndex);

        // => THIS: 给当前元素的某个事件绑定方法,当事件触发,方法执行的时候,方法中的THIS是当前操作的元素对象

    }

}*/

// => 解决方案:闭包

for(var i = 0;i<tabList.length;i++){

    tabList[i].onclick = (function (n) {

    // => 让自执行函数执行,把执行的返回值(return)赋值给ONCLICK(绑定的是返回的小函数,点击的时候是小函数),自执行函数在给事件赋值的时候就已经执行了

        var i = n;

        return function(){

            changeTab(i)

        }

    })(0)

}

/*

* i = 0; 第一次循环

*  tabList[0].onclick = (function(n){

// 自执行函数执行形成一个私有作用域(不释放:返回的函数对应的堆地址被外面的事件占用了)

// 1.形参赋值 n = 0;

// 2.变量提升 var i;

var i = n;

return function(){ //点击的时候执行小函数

    changTab(i)

}

  })(i)  // 把本次全局i(0)当作实参传递给n

*

* 总结: 循环三次,形参三个不销毁的私有作用域(自执行函数执行),每一个不销毁的栈内存中都存储了一个私有变量i,而这个值分别是每一次执行传递进来的是全局的i(也就是:第一个不销毁的作用域存储的是0,第二个是1,第二个是2):当我们点击的时候,执行返回的是小函数,遇到变量I,向它自己的上级作用域查找,找到的i值分别是0/1/2,达到了我们想要的效果。

*/

for(var i = 0;i<tabList.length;i++){

    (function (n){

        tabList[n].onclick = function(){

            changeTab(i);

        }

    })(i)

}

/*

* 基于ES6来创建变量,是存在块级作用域的(类似于私有作用域)

作用域:(栈内存)

1.全局作用域

2.私有作用域(函数执行)

3.块级作用域(一般用大括号包起来的都是块级作用域),前提是ES6规范

*/

for (let i =0;i<tabList.length;i++){

    tabList[i].onclick = function(){

        changeTab(i)

    }

}

/* 机制let解析机制

{

    let i =0;

    tabList[i].onclick = function(){

        changeTab(i)

    }

}

{

    let i =1;

    tabList[i].onclick = function(){

        changeTab(i)

    }

}

{

    let i =2;

    tabList[i].onclick = function(){

        changeTab(i)

    }

}*/

let a = 100;

{

    let a = 100;

    {

        {

            console.log(a)

        }

        // let a = 200; //保错

    }

}

for(let i=0;i<5;i++){

    //=>循环体中也是块级作用域,初始值设置的变量是当前本次块级作用域的变量(形成五个块级作用域,每个块级作用域中都有一个私有变量i,变量值就是每一个循环I的值)

}

// var obj = {}; //=>对象的大括号不是块级作用域

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容

  • 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。 一、变量...
    zock阅读 1,072评论 2 6
  • 闭包: 官方”的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该...
    小裁缝sun阅读 610评论 0 5
  • 谈起闭包,它可是JavaScript两个核心技术之一(异步和闭包),在面试以及实际应用当中,我们都离不开它们,甚至...
    强哥科技兴阅读 556评论 0 1
  • 【鬼谷语录】008天 人生不缺乏美丽 缺乏的是发现美丽的眼睛与体验美好的心灵❤️ 用心生活的人,总能发现生命之美!...
    鬼谷老尤阅读 307评论 1 0
  • 从印度佛教思想的流变中,能时时回顾,不忘正法,为正法而怀念人间的佛陀。好像明白师父当初为什么先让我看《印度佛教思想...
    乐乙游阅读 135评论 0 1