转化一个数字数组为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]();
} );
关于此法,不再详解,此题结束!
转化一个数字数组为function数组(每个function都弹出相应的数字)的更多相关文章
- javascript 转化一个数字数组为function数组(每个function都弹出相应的数字)
javascript 转化一个数字数组为function数组(每个function都弹出相应的数字) var arrNum = [2,3,4,5,6,10,7]; var arrFun = []; f ...
- JS函数 编程练习 使用javascript代码写出一个函数:实现传入两个整数后弹出较大的整数。
编程练习 使用javascript代码写出一个函数:实现传入两个整数后弹出较大的整数. 任务 第一步: 编写代码完成一个函数的定义吧. 第二步: 我们来补充函数体中的控制语句,完成函数功能吧. 提示: ...
- Python实现使用tkinter弹出输入框输入数字, 具有确定输入和清除功能
Python3.6中用tkinter, 弹出可以输入数字的输入框. # Copyright (c) 2017-7-21 ZhengPeng All rights reserved. def pop_u ...
- JavaScript的for循环中嵌套一个点击事件为何点击一次弹出多个相同的值
先看下面一段代码: for(var i=0; i<10; i++) { $('#ul').bind('click', function() { alert(i) }) } 对于这段代码,当点击I ...
- 点击一个ul的五个li元素,分别弹出他们的序号,怎么做?
方法1 : for(var i=0; i<oLis.length; i++){ oLis[i].onclick = (function(j){ return function(){ alert( ...
- Android进入一个新页面,EditText失去焦点并禁止弹出键盘
android在进入一个新页面后,edittext会自动获取焦点并弹出软键盘,这样并不符合用户操作习惯. 在其父控件下,添加如下的属性,就可以完美解决,使其进入页面后不主动获取焦点,并且不弹出软键盘: ...
- 创建一个弹出DIV窗口
创建一个弹出DIV窗口 摘自: http://www.cnblogs.com/TivonStone/archive/2012/03/20/2407919.html 创建一个弹出DIV窗口可能是现在 ...
- 基于visual Studio2013解决面试题之0409判断一个栈是否另外一个栈的弹出序列
题目
- MFC中按下Buttonbutton,弹出一个窗体的同一时候关闭本窗体
CMyDlg *dlg = new CMyDlg(); //新建一个CMyDlg对象 this->ShowWindow(SW_HIDE); ...
随机推荐
- chrome 切换到其他网络后重新加载网
chrome 突然提示 “您与 www.google.com 之间的安全连接目前正受到干扰. 请等待几分钟后再尝试重新加载网页,或在切换到其他网络后重新加载网” 查看证书发现 已经过期 解决:同步下 ...
- 《Cracking the Coding Interview》——第1章:数组和字符串——题目6
2014-03-18 01:45 题目:给定一个NxN的矩阵,就地旋转90度.(没有样例又不说方向的话,随便往哪儿转.) 解法:如果N为奇数,除了中心点以外四等分.如果N为偶数,四等分.按照A-> ...
- 如何将现有的项目添加到远程的git库里面!
我们经常都会遇到这样的场景,就是将本地的一个项目同步到网上远程的git库里面.最近也遇到这样的问题,发现网上很少人讲到这个问题,但是这个问题是很多程序员遇到的版本库管理的最早的拦路虎. 我的远程是ht ...
- ASP.NET Core 2.1 源码学习之 Options[3]:IOptionsMonitor 【转】
原文链接:https://www.cnblogs.com/RainingNight/p/strongly-typed-options-ioptions-monitor-in-asp-net-core. ...
- RelativeLayout布局属性
Android RelativeLayout属性 // 相对于给定ID控件 android:layout_above 将该控件的底部置于给定ID的控件之上; android:layout_below ...
- springboot09 事务 H2数据库
一.事务 1. 事务介绍 事务可以包含多个操作步骤 , 如果有一个步骤失败,那么这一组都以失败告终. 事务是指包含多个微小逻辑单元的一组操作, 只要其中有一个逻辑失败了,那么这一组操作就全部以失败告终 ...
- android自定义控件属性
有两种方法为自定义的控件设置属性 . 来自为知笔记(Wiz)
- Java进行身份证格式强校验(准)
最近做了一个系统,涉及到对用户输入的身份证号进行校验,减少脏数据传入后台处理并降低企业验证成本,因此在接入层便对输入信息做格式强校验. 直接附上代码,可直接使用. package hope.ident ...
- Codeforces - 220B Little Elephant and Array(莫队模板题)
题意: m次查询.每次查询范围[L,R]中出现次数等于该数字的数字个数. 题解: 由于分块,在每次询问中,同一块时l至多移动根号n,从一块到另一块也是最多2倍根号n.对于r,每个块中因为同一块是按y排 ...
- 使用python读取mysql数据库并进行数据的操作
(一)环境的配置 使用python调用mysql数据库要引进一些库. 目前我使用的python版本是python3.6.引进库为pymysql 其他对应的库可以有以下选择: mysqldb,oursq ...