function fn(arr) {
for (var i=0;i < arr.length;i++) {
arr[i]=function () {
document.write(i);
document.write(arr[i]); //为什么这里没有变成a,b,c?
};
arr[i]();
document.write("<br />");
}
}
var arr = ['a','b','c'];
fn(arr);
for (var i=0;i < arr.length;i++) {
arr[i]=function () {
document.write(i);
document.write(arr[i]); //为什么这里没有变成a,b,c?
};
arr[i]();
document.write("<br />");
}
}
var arr = ['a','b','c'];
fn(arr);
解决方案 »
- js+html+webservice如何来存储服务端对象的状态?
- 用javascript来关本页面,并刷新另一页面,在线等
- PHP 大家帮我讲解一下这个文件 i.js 函数嵌套问题
- Ext中form表单布局问题
- 用javascript存储输入的资料,现我有一段断码,能只输入一条数据,请高手指教下如何存储第2天数据的同时保留第1条数据 急!谢谢
- js如何实现鼠标经过与离开div,执行渐变的效果!急!!
- XMLHTTP有CLOSE方法吗?
- 引用jQuery v1.10.2文件,在IE下滚动鼠标正常,谷歌和360下一直向下滚动,无法向上?
- JS关于打印的问题?(2个问题)
- 求解一个定时器的问题
- 缓动效果求助
- JAVASCRIPT定时器
function fn(arr) {
for (var i=0;i < arr.length;i++) {
arr[i]=function () {
alert(i+" | "+arr[i]);
}; }
}
var arr = ['a','b','c']; fn(arr);
//alert (arr[0]);
arr[0](); /*
输出 4 和 undefined
为什么有4?
fn内部的 i 在函数执行完后应该没有了才对啊 */
js里面for语句没有单独作用域 for (var i=0;i < arr.length;i++) {
arr[i]=function () {
alert(i+" | "+arr[i]);
};
等价于:
var i;
for (i=0;i < arr.length;i++) {
arr[i]=function () {
alert(i+" | "+arr[i]);
};
这样写明白了么?
你每个数组里面访问的i实际是同一个变量,for语句执行完以后,i=3,arr[0],arr[1],arr[2]调用时使用的i都是同一个变量,所以里面的i都是3.
还有i在函数执行完之后没有被释放,原因是被还生存的变量持有,js里面只有资源没有被生存期的变量持有时才会自动释放
最后一点,
alert(i+" | "+arr[i]);
arr[i] 不会变成a,b,c的原因二楼讲清楚了。
但是为什么前面的i也没有变成0,1,2我以为fn(arr);之后,arr数组的成员应该是这样arr = ['alert(0+" | "+arr[i]);',
'alert(1+" | "+arr[i]);',
'alert(2+" | "+arr[i]);']但它却是这样arr = ['alert(i+" | "+arr[i]);',
'alert(i+" | "+arr[i]);',
'alert(i+" | "+arr[i]);']
for (var i=0;i < arr.length;i++) {
arr[i]=function () {
alert(i+" | "+arr[i]);
};
arr[i](); //这里就执行一次
}
}
var arr = ['a','b','c'];
fn(arr);
应该是这样,fn(arr)后,arr成员是这样arr = ['function(){alert(0+" | "+arr[i]);}',
'function(){alert(1+" | "+arr[i]);}',
'function(){alert(2+" | "+arr[i]);}']
在arr[i](),这句输出 0 | function () { alert(i+" | "+arr[i]); }
1 | function () { alert(i+" | "+arr[i]); }
2 | function () { alert(i+" | "+arr[i]); }
也就是fn函数的第4行,i 被 解释为当前的index 0,1,2,
arr[i] 解释成为function () { alert(i+" | "+arr[i]); }
而这个匿名函数里的变量没有被解释。还是原来的语句。js在解释变量有什么规则吗
我说过了,for语句执行后i的值为3,不是执行过程中就已经是3了,不要混淆
这个和上面的是不同的,这是在循环过程中输出的,而前面是在循环完之后输出的自己好好分析 alert执行的时候i的值
楼上我说的是,js在解析代码时,把变量和它的值相关联,
alert(i+" | "+arr[i]);
i 变成0 / 1 / 2
arr[i] 变成 function () {
alert(i+" | "+arr[i]);
};
换个例子function f(arr) {
var i=2;
var j='a',k = 'b';
arr[i] = function(){alert(i);alert(j);alert(k);alert(arr[i]);} /*alert(arr[i]); 所指向的函数内部的变量没有被解释*/
};arr = [1,2,3]
f(arr);
arr[2]();
2
a
b
function(){alert(i);alert(j);alert(k);alert(arr[i]);}你如果想alert(arr[i])时再执行一次函数
应该写成alert(arr[i]())不过这样就无限递归了
alert(arr[i])的执行过程是调用arr[i].toString()方法,将返回的字符串弹出,不是执行函数,所以当然不会执行其中的代码,真不知道你是怎么思考的
都是逻辑简单的问题,需要你自己思考搞清楚,给你解释你不思考也没用