JS约瑟夫问题 循环链表还问题

2561人阅读
首先看一段代码:
&!DOCTYPE html&
charset="utf-8"&
var btn=document.getElementsByTagName('button');
for(var i=0;i&btn.i++){
btn[i].onclick=function(){
console.log(i);
然后运行一下,当时作为一名天真的js初学者理所当然的认为分别点击不同的额按钮,会分别的打印出0、1、2、3、4,然而事与愿为,现实和理想总是存在差距,点击不同的按钮,打印却都是5,百思不得其解,不科学啊!
最后百度了一番才恍然大悟,原来console.log(i)里的i在循环完成的时候被赋值成了5,而每个按钮的onclick都被赋值了同一个function,也就是说每个function里的i指的是同一个i,i=5,自然每个点击都会打印出5,那么该怎么解决呢?!
再看接下来这段代码:
var btn=document.getElementsByTagName('button');
for(var i=0;i&btn.i++){
(function(i){
btn[i].onclick=function(){
console.log(i);
再运行这段代码,就可以得到你想要的效果,但是是为什么呢?
知道了原因就好办了,利用闭包把每个function里的i都变成不同的i就行了,当时作为一名初学者还不懂闭包,也是后来才理解的。
循环中的function自调用,将循环中的i作为参数传入function中,此时,function中的i已经不是循环中的i了(这里有点绕,其实形参i,即function里的i换成什么变量名都行),而是在内存中开辟了一个内存空间存储了作为参数传进来的i的值,这样function中的就不会随着循环中的i的值的改变而改变了,就可以打印出你要的结果了。
怎么样?是不是很坑爹,这是一个很常见的问题,还望js的初学者们好好体会,我当时也是蒙蔽了好久!!!
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:23086次
排名:千里之外
原创:26篇
(1)(5)(3)(2)(1)(3)(3)(3)(4)(4)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'function stop() {
clearTimeout(t);
function checkTime(i) {
if (i & 10) {
i = &0& +
function fun2(week) {
var Week = [ &星期日&, &星期一&, &星期二&, &星期三&, &星期四&, &星期五&, &星期六& ];
return Week[week];
function startTime() {
var today = new Date();
var year = today.getFullYear();
var Month = today.getMonth() + 1;
var day = today.getDate();
var h = today.getHours();
var m = today.getMinutes();
var s = today.getSeconds();
var week = today.getDay();
m = checkTime(m);
s = checkTime(s);
document.getElementByIdx_x(&txt&).value = year + &/&
+ checkTime(Month) + &/& + day + & & + h + &:& + m + &:&
+ s + & & + fun2(week);
t = setTimeout(&startTime()&, 1000);
startTime();
上面代码运行起来是没错
若是这样呢
while(true){
t = setTimeout(&startTime()&, 1000);
今天同学问到了这个为啥不能用循环呢,我给的解释就是用循环没有结束标记一直循环就会内存溢出,内存会爆表,于是乎我就试了试,果然,一试不要紧,360加速球直接从40%跑到99%爆表 &&电脑滋啦啦的响了一声,于是我只能强制关机,今天又看了看,原来循环不会因为setTimeout的存在而停止,他会跳过循环一直执行,这也就解释了为什么我的电脑会那样。。。
本文已收录于以下专栏:
相关文章推荐
1、回调与循环的陷阱解析今天拜读BYVoid大神的《Node.js开发指南》小有收获,特地写篇博文出来给大家伙分享一下。文中提到了一个Node.js的回调与循环的陷阱。
下面是书上的源码var fs...
面向对象编程语法中我们会碰到break ,continue, return这三个常用的关键字,那么关于这三个关键字的使用具体的操作是什么呢?我们在使用这三关键字的时候需要注意和需要理解的规则是什么呢?
在js中供给了indexOf()函数以获取某个字符在字符串中的index,可以经由过程它也断定某个字符或字符串是否存在。
但同时在js中for轮回也可以实现同样的结果(断定字符是否存在)。那么到...
针对数组,for循环完全OK,此处略过不表,只说一说为方便我们开发而那些内置的方法:
就是for循环的简化,将每个值取出去做我们想做的事儿
的异步机制由事件和回调函数实现,一开始接触可能会感觉违反常规,但习惯以后就会发现还是很简单的。然而这之中其实暗藏了不少陷阱,一个很容易遇到的问题就是循环中的回调函数,初学者经常容易陷...
这篇文章主要是讲完全背包问题中,什么情况下两个for循环的位置不能交换。
在点击打开链接(完全背包问题----思想的理解)中我们提到,完全背包一维数组的实现的两个for循环是可以交换顺序的。...
他的最新文章
讲师:汪剑
讲师:刘道宽
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)[js]循环赋值时的坑 - 简书
[js]循环赋值时的坑
废话不说,先看代码:
var tArr = [];
var tO = {name: 'name', age: '10'};
for (var i = 0; i & 5; i++) {
tO.name = 'name' +
tO.age = 10 +
tArr.push(tO);
console.log(tArr);
本来按照预期的顺序,结果应该是:
[{"name":"name0","age":10},{"name":"name1","age":11},{"name":"name2","age":12},{"name":"name3","age":13},{"name":"name4","age":14}]
然而结果说明自己还是图样:
不正确的结果
后来想了一下,改变了代码:
var tArr = [];
for (var i = 0; i & 5; i++) {
var tO = {name: 'name', age: '10'};
tO.name = 'name' +
tO.age = 10 +
tArr.push(tO);
console.log(tArr);
这次结果确实是想要的结果了。不过其中原理并没有想明白,于是查资料了解到大概。
在这例子中,需要注意的是Object对象是地址引用传递的,也就是说,当对象tO在循环外声明时,在循环内部每次的tArr.push(tO)添加的都是同一个对象,结果tArr中tArr[0]、tArr[1]存放的都是这个对象的引用地址,循环中对象发生了改变,所有对它的引用自然也会受到影响,而循环结束后对象不再改变,所以我们看到的结果就是上图中的结果。
从这么点小问题来看,自己的基础还不是很扎实啊。希望大牛路过交流指导。
咸鱼沉浮也能看到曙光。

我要回帖

更多关于 循环优化法问题 的文章

 

随机推荐