汤姆大叔的博客里看到了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]();
} );

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

转化一个数字数组为function数组(每个function都弹出相应的数字)的更多相关文章

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

    javascript 转化一个数字数组为function数组(每个function都弹出相应的数字) var arrNum = [2,3,4,5,6,10,7]; var arrFun = []; f ...

  2. JS函数 编程练习 使用javascript代码写出一个函数:实现传入两个整数后弹出较大的整数。

    编程练习 使用javascript代码写出一个函数:实现传入两个整数后弹出较大的整数. 任务 第一步: 编写代码完成一个函数的定义吧. 第二步: 我们来补充函数体中的控制语句,完成函数功能吧. 提示: ...

  3. Python实现使用tkinter弹出输入框输入数字, 具有确定输入和清除功能

    Python3.6中用tkinter, 弹出可以输入数字的输入框. # Copyright (c) 2017-7-21 ZhengPeng All rights reserved. def pop_u ...

  4. JavaScript的for循环中嵌套一个点击事件为何点击一次弹出多个相同的值

    先看下面一段代码: for(var i=0; i<10; i++) { $('#ul').bind('click', function() { alert(i) }) } 对于这段代码,当点击I ...

  5. 点击一个ul的五个li元素,分别弹出他们的序号,怎么做?

    方法1 : for(var i=0; i<oLis.length; i++){ oLis[i].onclick = (function(j){ return function(){ alert( ...

  6. Android进入一个新页面,EditText失去焦点并禁止弹出键盘

    android在进入一个新页面后,edittext会自动获取焦点并弹出软键盘,这样并不符合用户操作习惯. 在其父控件下,添加如下的属性,就可以完美解决,使其进入页面后不主动获取焦点,并且不弹出软键盘: ...

  7. 创建一个弹出DIV窗口

    创建一个弹出DIV窗口 摘自:   http://www.cnblogs.com/TivonStone/archive/2012/03/20/2407919.html 创建一个弹出DIV窗口可能是现在 ...

  8. 基于visual Studio2013解决面试题之0409判断一个栈是否另外一个栈的弹出序列

     题目

  9. MFC中按下Buttonbutton,弹出一个窗体的同一时候关闭本窗体

     CMyDlg *dlg = new CMyDlg();                //新建一个CMyDlg对象 this->ShowWindow(SW_HIDE);           ...

随机推荐

  1. iOS系统信息集合

    在项目开发的时候,经常需要用到某些系统信息,比如手机型号(5s,6,6p), 操作系统版本(8.0 or 9.3), 当前网络类型(3/4g, wifi)等信息. 有了这些信息, 可以在出了某些bug ...

  2. 《Cracking the Coding Interview》——第2章:链表——题目4

    2014-03-18 02:27 题目:将一个单链表按照一个值X分为两部分,小于X的部分放在大于等于X的部分之前. 解法:按照值和X的大小,分链表为两条链表,然后连起来成一条. 代码: // 2.4 ...

  3. windows下Tomcat安装

    环境Windows 64位 jdk1.8 1.Tomcat安装 官网地址:http://tomcat.apache.org/download-90.cgi 下载安装包,安装之后进行解压 2.修改htt ...

  4. 【Python】python常用模块

    一.模块.包 什么是模块? 模块实质上就是一个python文件,它是用来组织代码的,意思就是说把python代码写到里面,文件名就是模块的名称,test.py test就是模块名称. 什么是包? 包, ...

  5. selenium自动化测试浏览器驱动安装(属于转载文章)

    1.下载selenium压缩包 http://pypi.python.org/pypi/selenium 下载后压缩在python文件下的lib>site-package文件夹下 2.进入sel ...

  6. nodejs下载图片到本地,根据百度图片查找相应的图片,通过nodejs保存到本地文件夹

    根据百度图片查找相应的图片:输入图片关键字,输入图片数量(默认是30条),通过nodejs将批量保存图片到本地文件夹. 代码已上传到github上:代码github的地址 下载后进去back-end: ...

  7. heat应用

    作为OpenStack中的编排引擎,Heat能够出色的完成编排任务,井井有条地管理编排出来的资源.但同时,Heat也是一个出色的应用部署引擎,它提供了一套内置的框架去完成一系列复杂的应用部署任务. 使 ...

  8. STL之heap使用简介

    STL中并没有把heap作为一种容器组件,heap的实现亦需要更低一层的容器组件(诸如list,array,vector)作为其底层机制.Heap是一个类属算法,包含在algorithm头文件中.虽然 ...

  9. maven中mapper.xml不发布的问题

    在自定义的包中定义了mapper.xml然后利用mybatis的扫描包形式来动态创建mapper 开启工程报错: 说无效的绑定 原因: 发布的war中,工程包中的mapper根本就没有出现在class ...

  10. ajax是可以本地运行的

    ajax是可以本地运行的,经过验证,可以是可以,但跟浏览器有关,火狐和新IE可以,chrome不可以,旧ie不知道什么原因也不可以.但是浏览器也有它的安全策略,必须是同一目录下的文件可以访问.chro ...