• 转化一个数字数组为function数组(每个function都弹出相应的数字)


    汤姆大叔的博客里看到了6个基础题目:本篇是第2题 - 转化一个数字数组为function数组(每个function都弹出相应的数字)

    此题关键点:

    1、如何将一个匿名函数存入数组?

    2、如何锁住需要调用的值?

    解点1:如何将一个匿名函数存入数组?

    var arr = [];
    arr[0] = function() { alert('ok'); }

    如上,arr[0]即为一个函数,可用arr[0]()进行调用。下面是初步实现的代码:

    var arr = [9,8,7,6];
    function toFunctionArray(arr) {
        for(var i=0; i<arr.length; i++) {
            var v = arr[i];
            arr[i] = function() {
                alert( v );
            };
        }
    }
    toFunctionArray(arr);
    for(var i=0; i<arr.length; i++) {
        arr[i]();
    }

    以上代码,看起来没毛病,但是运行就会发现弹出4次 6。为何会如此?请继续看解点2

    解点2:如何锁住需要调用的值?

    在toFunctionArray函数中的for循环会执行4次,循环结束后,v的值是6(第4个元素的值),即转换后的数组中的每一个元素总是alert了同一个v。如何让每个函数调用不同的v呢?解决这个问题的办法就是把v的值传递给匿名函数,代码如下:

    var arr = [9,8,7,6];
    function toFunctionArray(arr) {
        for(var i=0; i<arr.length; i++) {
            var v = arr[i];
            arr[i] = function(v) {
                alert( v ); //每个v都保存了不同的值
            }(v); //注意此处的v作为匿名函数的参数
        }
    }
    toFunctionArray(arr);
    for(var i=0; i<arr.length; i++) {
        arr[i]();
    }

    如果此处不太明白,请了解javascript变量的作用域、js内存回收机制、闭包等概念。

    -------------------------------------------- 解题完毕的分割线 -------------------------------------------

    此外,可用数组的forEach来实现,会变得比较直观,代码如下:

    var arr = [9,8,7,6];
    function toFunctionArray(arr) {
        arr.forEach( function(v, i, arr) {
            arr[i] = function() {
                alert( v );
            }
        } );
    }
    toFunctionArray(arr);
    arr.forEach( function(v, i, arr) {
        arr[i]();
    } );

    关于此法,不再详解,此题结束!

  • 相关阅读:
    DNT论坛整合笔记二
    LINQ中的动态排序
    无法安装数据库关系图支持对象的解决方法
    总访问量,日访问量,周访问量统计代码
    ASP.NET 数据绑定控件和 Eval方法
    KindEditor ASP.NET 上传/浏览服务器 附源码
    地图定位 图吧地图定位 附javascript源码每行都有注释
    java.io.IOException: Unable to open sync connection!
    Canvas和Paint实例
    Android初级教程_获取Android控件的宽和高
  • 原文地址:https://www.cnblogs.com/langzs/p/6637264.html
Copyright © 2020-2023  润新知