转化一个数字数组为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); ...
随机推荐
- ARC下,不显式指定任何属性关键字时,默认的关键字都有哪些
1.对应基本数据类型默认关键字是 atomic,readwrite,assign 2.对于普通的 Objective-C 对象 atomic,readwrite,strong
- OVGap 原生与JS交互
源代码:https://github.com/windshg/OVGap OVGap:一个轻量级的类库,能够让iOS应用和远程网页的 Javascript 代码进行通信,也就是说,远程的 Javasc ...
- USACO Section1.2 Palindromic Squares 解题报告
palsquare解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------ ...
- 一个初学者的辛酸路程-jQuery
前言: 主要概要: 1.HTML+CSS补充 2.DOM事件 3.jQuery示例 内容概要: 1.布局 代码如下 <!DOCTYPE html> <html lang=" ...
- python练习题及实现--文件处理、date日期
练习题作者:Vamei 出处:http://www.cnblogs.com/vamei http://www.cnblogs.com/vamei/archive/2012/07/19/2600135. ...
- ctags+cscope替换sourceinsight
背景 windows环境开发+linux交叉编译的开发模式,代码阅读和编写都用的source-insight. 除了检索,跳转,工程构建等方面,sourceinsight自带了一些宏语言,可以轻松实现 ...
- hnust 分蛋糕
问题 B: 分蛋糕 时间限制: 1 Sec 内存限制: 128 MB提交: 2430 解决: 966[提交][状态][讨论版] 题目描述 今天是DK生日,由于DK的朋友很多,所以DK在蛋糕店定制了 ...
- NodeJs04
REST API的设计 前言 客户端通过请求URL,传递参数,去获取指定的数据,这就是API(ApplicationProgramInterface). API是前端和客户端操作后端数据的一种方式,一 ...
- linux服务进程管理
1.查看linux占用内存/CPU最多的进程 查使用内存最多的10个进程 ps -aux | sort -k4nr | head -n 10 或者top (然后按下M,注意大写) 查使用CPU最多的1 ...
- (总结)统计Apache或Nginx访问日志里的独立IP访问数量的Shell
1.把IP数量直接输出显示:cat access_log_2011_06_26.log |awk '{print $1}'|uniq -c|wc -l 2.把IP数量输出到文本显示:cat acces ...