zoukankan      html  css  js  c++  java
  • js的闭包

    Wikipedia对闭包的定义是这样的:
    In computer science, a closure is a function together with a referencing environment for the nonlocal names (free variables) of that function.

    从技术上来讲,在JS中,每个function都是闭包,因为它总是能访问在它外部定义的数据。

    var a=[];
    function test()
    {
    for(var i=0;i<6;i++)
    {
    a[i]=i;
    }
    }
    test();
    for(var j in a)
    {
    document.write(a[j]+'</br>');
    }

    这个如果按照定义也算是闭包了,但是我们普通也可以访问a.

    由于普通函数外部定义的变量都可以访问,因此一般只有嵌套的函数我们才会重点研究,大家常说的也是嵌套的是闭包。

    在我理解看来嵌套函数的闭包有两个作用:

    ① 保证对外函数内部的变量访问,保证变量一直存在在内存里,这样还能保证数据的安全性。

     function a(){
    var i=0;
    function b(){
         i++;//可以对a内部的变量修改,同时还可以通过return b来返回i,保证了i长存内存内,还能进行修改,还能访问到i
    alert(i);
    }
    return b;
    }
    var c = a();
    c();

     ② 解决块级域带来的函数执行时外部变量的值是有运行时决定,而不是定义的时候决定的,例如如下例子:

    var tasks = [];
    for (var i = 0; i < 5; i++) {
    tasks[tasks.length] = function () {
    document.write('Current cursor is at ' + i + '</br>');
    };
    }

    var len = tasks.length;
    while (len--) {
    tasks[len]();
    }

    var tasks = [];
    for (var i = 0; i < 5; i++) {
    tasks[tasks.length] = (function(i){
    return function () {
    document.write('Current cursor is at ' + i + '</br>');
    }
    })(i);
    }

    var len = tasks.length;
    while (len--) {
    tasks[len]();
    }

    结果打印

    Current cursor is at 5
    Current cursor is at 5
    Current cursor is at 5
    Current cursor is at 5
    Current cursor is at 5
    Current cursor is at 4
    Current cursor is at 3
    Current cursor is at 2
    Current cursor is at 1
    Current cursor is at 0

    我们看到了,其实第一个函数,运行后和我们预期是不一样的,这是Lift效应,因此加一个闭包,将i外部变量作为参数传进来,打破了这种问题。

    这是目前我遇到的两种作用

  • 相关阅读:
    浏览器渲染页面
    递归求1-100之和
    border属性
    ES6 Class
    数组去重
    get、post请求
    对象冒充继承
    原型链继承
    实现JS数据拷贝
    【转】centos升级curl版本
  • 原文地址:https://www.cnblogs.com/hhjiang14/p/4314547.html
Copyright © 2011-2022 走看看