码迷,mamicode.com
首页 > 编程语言 > 详细

《javascript设计模式与开放实践》学习(三)函数的闭包1

时间:2016-09-14 00:04:09      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:

假设也没有上有5个div节点,通过循环给每个div绑定onclick实现弹出对应的编号。代码如下:

<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<script>
    var nodes=document.getElementsByTagName(‘div‘);
    for (var i=0,len=nodes.length;i<len;i++){
        nodes[i].onclick=function () {
            alert(i+1);
        }
    };
</script>

运行后发现点击所有div都弹出6。原因是div节点onclick是异步触发的,触发的时候for循环早已结束,此时变量i的值是5。

解决办法就是采用闭包,修改下JS代码如下:

var nodes=document.getElementsByTagName(‘div‘);
    for (var i=0,len=nodes.length;i<len;i++){
        (function (i) {
            nodes[i].onclick=function () {
                alert(i+1);
            }
        })(i)

    };

 

书上还有一个例子,Object.prototype.toString()判断某个对象值属于哪种内置类型。

 for(var i=0,type;type=[‘String‘,‘Array‘,‘Number‘][i++];)这块语法不是特别懂。
var Type={}
    for(var i=0,type;type=[‘String‘,‘Array‘,‘Number‘][i++];){
        (function (type) {
            Type[‘is‘+type]=function (obj) {
                var result= Object.prototype.toString.call(obj)===‘[object ‘+type+‘]‘;
                console.log(result);
            }
        })(type)
    };

    Type.isArray([]);//输出true
    Type.isString(‘str‘);//输出true

 

《javascript设计模式与开放实践》学习(三)函数的闭包1

标签:

原文地址:http://www.cnblogs.com/GallopingSnail/p/5870106.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!