美文网首页
javascript用闭包保存状态

javascript用闭包保存状态

作者: 赠前端 | 来源:发表于2018-02-23 17:57 被阅读0次

先贴上错误的代码

var a = [];  
for(var i=0; i<10; i++){  
  var c = i;  
  a[i] = function(){  
    alert(c);  
  }  
}  
a[3]();  

很多人会认为上面这段代码打印出来的会是3;
结果是9。

由于i是一个全局变量,a数组里面存的是一个函数,属于一个引用。而i的值一直在增加所以,最后输出来的会是9。

var a = [];  
for(var i=0;i<10;i++){  
    var c = i;  
    (function (v){  
        a[i] = function (){  
            alert(v);  
        }  
    })(i);  
      
}  
a[3](); 

通过闭包方式保存i的状态来达到输出自己想要的结果

// 这个代码是错误的,因为变量i从来就没背locked住
// 相反,当循环执行以后,我们在点击的时候i才获得数值
// 因为这个时候i操真正获得值
// 所以说无论点击那个连接,最终显示的都是I am link #10(如果有10个a元素的话)

var elems = document.getElementsByTagName('a');
for (var i = 0; i < elems.length; i++) {
    elems[i].addEventListener('click', function (e) {
        e.preventDefault();
        alert('I am link #' + i);
    }, 'false');
}

// 这个是可以用的,因为他在自执行函数表达式闭包内部
// i的值作为locked的索引存在,在循环执行结束以后,尽管最后i的值变成了a元素总数(例如10)
// 但闭包内部的lockedInIndex值是没有改变,因为他已经执行完毕了
// 所以当点击连接的时候,结果是正确的

var elems = document.getElementsByTagName('a');
for (var i = 0; i < elems.length; i++) {
    (function (lockedInIndex) {
        elems[i].addEventListener('click', function (e) {
            e.preventDefault();
            alert('I am link #' + lockedInIndex);
        }, 'false');

    })(i);
}

// 你也可以像下面这样应用,在处理函数那里使用自执行函数表达式
// 而不是在addEventListener外部
// 但是相对来说,上面的代码更具可读性

var elems = document.getElementsByTagName('a');
for (var i = 0; i < elems.length; i++) {
    elems[i].addEventListener('click', (function (lockedInIndex) {
        return function (e) {
            e.preventDefault();
            alert('I am link #' + lockedInIndex);
        };
    })(i), 'false');
}

相关文章

  • javascript用闭包保存状态

    先贴上错误的代码 很多人会认为上面这段代码打印出来的会是3;结果是9。 由于i是一个全局变量,a数组里面存的是一个...

  • 关于立即执行函数IIFE

    [译] JavaScript:立即执行函数表达式(IIFE) IIFE保存闭包的状态 就像当函数通过他们的名字被调...

  • 闭包保存正确状态

    下面是一段很正常的代码,获取元素循环元素,点击其中一个li的时候弹出相对应的索引,为什么点击每一个li都弹出(点击...

  • JavaScript----闭包

    javascript之闭包 闭包的概念     闭包(closure)是 JavaScript 的一种语法特性。 ...

  • 2018-12-05封闭函数和闭包

    封闭函数用 !或者 ~ 还有 ()() 闭包 闭包就是函数里面有函数,也可以叫函数的嵌套 闭包用途 保存索引li{...

  • 封闭函数和闭包

    封闭函数用 !或者 ~ 还有 ()() 闭包 闭包就是函数里面有函数,也可以叫函数的嵌套 闭包用途 1.保存索引 ...

  • 学习JavaScript闭包和作用域笔记

    JS JavaScript闭包和作用域 闭包 JavaScript高级程序设计中对闭包的定义:闭包是指有权访问另外...

  • golang

    golang中闭包的问题 熟悉go语言的开发者都知道,go的闭包是可以记录状态的。当我想用闭包来实现保存某一str...

  • javascript中闭包是什么

    javascript中闭包是什么 JavaScript 变量可以是局部变量或全局变量。私有变量可以用到闭包。闭包就...

  • 闭包和高阶函数(节流、分时、惰性加载)

    javaScript设计模式中,许多模式都可以用闭包和高阶函数来实现 闭包 一般理解闭包就是返回一个匿名函数,可以...

网友评论

      本文标题:javascript用闭包保存状态

      本文链接:https://www.haomeiwen.com/subject/yngxxftx.html