转化一个数字数组为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); ...
随机推荐
- Web 开发的未来:React、Falcor 和 ES6
Web 开发的未来:React.Falcor 和 ES6 Widen是一家数字资产管理解决方案提供商.目前,其技术栈还非常传统,包括服务器端的Java.浏览器端的AngularJS.提供REST AP ...
- Android学习记录(1)—Android中XML文件的序列化生成与解析
xml文件是非常常用的,在android中json和xml是非常常用的两种封装数据的形式,从服务器中获取数据也经常是这两种形式的,所以学会生成和解析xml和json是非常有用的,json相对来说是比较 ...
- FMDB的线程安全
最近面试被问到FMDB的多线程处理问题,因为之前项目中是移植别人的代码,没有踩过这里的坑. 问题: 多线程同时访问数据库时,报数据库锁定的问题,错误信息是: Unknown error finaliz ...
- linux运维笔记
一.查找大文件 sudo find / -size +100M -exec ls -lh {} \;
- 常用模块(string)
import string# dt = string.digits # 获取0-9的数字# dt = string.ascii_letters # 获取所有的大小写字母# dt = string.he ...
- nosetests
1.nosetests 执行出测试报告 提前安装 插件nose-html系列插件 nosetests -v --with-html-output --html-out-file=报告名.html ...
- form表单文件上传 servlet文件接收
需要导入jar包 commons-fileupload-1.3.2.jar commons-io-2.5.jar Upload.Jsp代码 <%@ page language="jav ...
- Thymeleaf 模板 在spring boot 中的引用和应用
Thymeleaf是一个java类库,他是一个xml/xhtml/html5的模板引擎和Struts框架的freemarker模板类似,可以作为mvc的web应用的view层. Thymeleaf还提 ...
- Codeforces Round #386 (Div. 2) 746F(set的运用)
题目大意 给出一个歌单(有n首歌),每个歌都有愉悦值和时间,你可以选择从第x首歌开始听(也就是选择连续的一段),并且你可以选择w首歌让它的时间减半,限制时间为k,求最大的愉悦值 首先我们需要贪心一下, ...
- 全网把Map中的hash()分析的最透彻的文章,别无二家。
你知道HashMap中hash方法的具体实现吗?你知道HashTable.ConcurrentHashMap中hash方法的实现以及原因吗?你知道为什么要这么实现吗?你知道为什么JDK 7和JDK 8 ...