【 在 ottffsse (nothing) 的大作中提到: 】
: 标 题: Re: 请高手帮我看一段关于javascript的二维数组的程序,有点见
: 发信站: 水木社区 (Sat Nov 23 14:09:52 2013), 站内
:
: closure设计的本意就是capture住所返回函数的外部变量吧。这样的话,byVal和byRef是程序员的责任啊。
:
: 像你前面所提到的问题,完全可以每次循环时新建一个变量解决。
这个东西,目前的标准做法其实是
for(var i=0;i<10;i++) {
setTimeout((function(i){
return function() {
console.log(i);
}
})(i), 0);
}
或者
for(var i = 0; i < 10; i++) {
(function(i) {
setTimeout(function(){
console.log(i);
}, 0);
})(i);
}
新建变量,这里也可以,但是很多比较复杂的地方会很麻烦。
:
: 如果都是byVal, 那么1)若closure就是想记住上次的值怎么办?2)如果是大对象复制很耗内存怎么办?
1.像C++11这种,传&val而不是val(所以其实也是by value,只不过是pointer的value)
其实从C起就这样,如果一个函数的参数传一个巨大的struct进去,是会被拷贝一遍的,
所以得传pointer。C的作者之一曾经讲过,这样的设计很重要,避免了很多之前语言的
弊端。可惜Javascript这点没学来
2.如果是C++,见1。函数式的语言则不存在这个问题
:
:
:
:
: 【 在 nimi (泥股拉不二八雞) 的大作中提到: 】
: : closure是从函数式编程(确切的说是从scheme)里面来的,那里面一般都不会使用变量,甚至根本就不能用变量。像ML里面,就算用了变量,closure的capture也是by value而不是by ref的,所以不会出这样的问题
: : C++11里面的closure如果直接写也是by value,加上了&才是by ref
: : 所以说,这个问题虽然其它语言也有,但是javascript是最严重的
:
: --
:
: ※ 修改:·ottffsse 于 Nov 23 14:13:46 2013 修改本文·[FROM: 218.197.83.*]
※ 修改:·nimi 于 Nov 23 15:49:16 2013 修改本文·[FROM: 114.244.145.*]
: ※ 来源:·水木社区
http://newsmth.net·[FROM: 218.197.83.*]
--
修改:ottffsse FROM 218.197.83.*
FROM 114.244.145.*