d*******r 发帖数: 3299 | 1 一个帖子,转来大家讨论一下
最近使用 closure 和 anonymous function 遇到些问题, 大家探讨一下。
简单说就是当临时写一个 closure 或者 anonymous function 当 callback 使用时候
,如果让这个 closure access 了 external scope 里面的 variable, 就容易出现 "
access mutable variable " 的问题 (WebStorm 就会报 warning).
比如这个帖子里面描述的例子:
http://samwize.com/2013/09/01/how-you-can-pass-a-variable-into-
里面的 callback 引用并使用了 external scope 里面的 i, 所以出错了。
他是通过用 bind( {i: i} ) 将 i 的值传入注册时候的 callback 来解决的,当然也
有其他方案, 比如将 dummy(i, function(response)) 改成 dummy(i, function(
response, i)) 也行。
我在想,上面这个问题可以通过 (某种方法) 将 i 的值传给 callback 来解决问题,
但是如果 i 是一个 object 的引用怎么办呢?
比如 i 是 someObjectRef = {name: 'abc', val: 123}, 然后这个 someObjectRef 也
可能在 callback 被注册后的将来,被改变,那当 callback 将来实际被执行的时候,
callback 里面的逻辑access 到的已经是 someObjectRef 将来的值了,比如 {name: '
ABC', val: 456}。那样的话,如果想 callback 里的逻辑使用 callback 注册时候的
someObjectRef 的值,岂不是传入 callback 的时候就得 copy/clone someObjectRef
当时的值?
这样做的话,就有点像其他 concurrent 模型里面的 "send a variable copy through
a message, but not give reference to the variable". 也就是说,Node.js 这种
single threaded 的模型,其实也是要隐性处理 issue of accessing shared
variables 的. 因为 single threaded 只是可以让 Node 的代码 access shared
variables 时候不用 lock;但是本质上讲, 注册 callback 了,就在将来开启另外一
个平行的执行流程了,那个执行流程和当前的执行流程 (以及其他 callback 执行流程
) 就可能 access shared variables.
大家说是不是这个道理?
另外,还想到一点,既然 closure accesses external mutable variables 这么危险
,是不是应该有一种编写 closure 的规范,比如所有 closure access 的变量,都应
该是:
case-1. 常数变量.
case-2. 这个变量的 most fresh copy (explicitly given/passed by calling
function).
关于 case-2, 比如在下面这种函数里面,就算是 most fresh copy:
receiveRemoteMessage.on('message', function(err, message) {/* process the
most fresh copy of this message*/}.
这里理想地假设 receiveRemoteMessage.on() 是在所有本地函数中最先得到这个
message 的, 处于 event chain 的唯一 root 位置.
大家怎么看这个问题. |
p*****2 发帖数: 21240 | |
d*******r 发帖数: 3299 | 3 closure accesses external mutable variables 挺危险的... WebStorm 是要报
warning 的呀
我觉得这个理解是对的:
如果想 callback 里的逻辑使用 callback 注册时候的 someObjectRef 的值,岂不是
传入 callback 的时候就得 copy/clone someObjectRef 当时的值?
... ...
这样做的话,就有点像其他 concurrent 模型里面的 "send a variable copy through
a message, but not give reference to the variable". |
p*****2 发帖数: 21240 | 4
through
不用webstorm,为什么你会感觉危险呢?
【在 d*******r 的大作中提到】 : closure accesses external mutable variables 挺危险的... WebStorm 是要报 : warning 的呀 : 我觉得这个理解是对的: : 如果想 callback 里的逻辑使用 callback 注册时候的 someObjectRef 的值,岂不是 : 传入 callback 的时候就得 copy/clone someObjectRef 当时的值? : ... ... : 这样做的话,就有点像其他 concurrent 模型里面的 "send a variable copy through : a message, but not give reference to the variable".
|
d*******r 发帖数: 3299 | 5 二爷你还没仔细读帖子吧,帖子里说的很清楚了呀,而且帖子里面那个例子就是很好的
说明,我copy下来跑过
而且如果你 Google: closure access mutable variable 的话,是有很多其他人的讨
论的
【在 p*****2 的大作中提到】 : : through : 不用webstorm,为什么你会感觉危险呢?
|
p*****2 发帖数: 21240 | 6 你能不能给个例子?那个太长懒得看。我用了这么久没觉得有啥问题。
【在 d*******r 的大作中提到】 : 二爷你还没仔细读帖子吧,帖子里说的很清楚了呀,而且帖子里面那个例子就是很好的 : 说明,我copy下来跑过 : 而且如果你 Google: closure access mutable variable 的话,是有很多其他人的讨 : 论的
|
p*****2 发帖数: 21240 | 7 看了一下 这个也太无聊了 你别总看这些没用的了
【在 p*****2 的大作中提到】 : 你能不能给个例子?那个太长懒得看。我用了这么久没觉得有啥问题。
|
d*******r 发帖数: 3299 | 8 我前几天写了一个类似的 bug ...
【在 p*****2 的大作中提到】 : 看了一下 这个也太无聊了 你别总看这些没用的了
|
p*****2 发帖数: 21240 | 9 那是你还不懂node
【在 d*******r 的大作中提到】 : 我前几天写了一个类似的 bug ...
|
d*******r 发帖数: 3299 | 10 我是 Node 新手呀, 经常在折腾中学习
【在 p*****2 的大作中提到】 : 那是你还不懂node
|
|
|
p*****2 发帖数: 21240 | 11 所以没必要大惊小怪的 这个是很好理解的
异步吗
【在 d*******r 的大作中提到】 : 我是 Node 新手呀, 经常在折腾中学习
|
d*******r 发帖数: 3299 | 12 我是觉得这个理解比较有意思:
如果想 callback 里的逻辑使用 callback 注册时候的 someObjectRef 的值,岂不是
传入 callback 的时候就得 copy/clone someObjectRef 当时的值?
这样做的话,就有点像其他 concurrent 模型里面的 "send a variable copy through
a message, but not give reference to the variable". 也就是说,Node.js 这种
single threaded 的模型,其实也是要隐性处理 issue of accessing shared
variables 的.
【在 p*****2 的大作中提到】 : 所以没必要大惊小怪的 这个是很好理解的 : 异步吗
|
p*****2 发帖数: 21240 | 13 完全错误 node的并发不是多线程
through
种
【在 d*******r 的大作中提到】 : 我是觉得这个理解比较有意思: : 如果想 callback 里的逻辑使用 callback 注册时候的 someObjectRef 的值,岂不是 : 传入 callback 的时候就得 copy/clone someObjectRef 当时的值? : 这样做的话,就有点像其他 concurrent 模型里面的 "send a variable copy through : a message, but not give reference to the variable". 也就是说,Node.js 这种 : single threaded 的模型,其实也是要隐性处理 issue of accessing shared : variables 的.
|
d*******r 发帖数: 3299 | 14 没说多线程呀,帖子说的是 "因为 single threaded 只是可以让 Node 的代码 access
shared variables 时候不用 lock"。都不用 lock 了,所以所谓 "平行执行的
callbacks" 还是在 single threaded 的主 thread 执行的 (可以算是虚拟平行执行)
,这些执行流程 access shared variable 的问题,是说如果那个 shared variable
是 mutable 的话,多个 (虚拟平行执行的) callbacks 可能修改这个 variable 而不
互相通知。
所以用 closure access external mutable variable 才是有可能有危险的。
我觉得 WebStorm 的 warning 还是挺靠谱的。
【在 p*****2 的大作中提到】 : 完全错误 node的并发不是多线程 : : through : 种
|
p*****2 发帖数: 21240 | 15 我不明白有啥危险的
access
【在 d*******r 的大作中提到】 : 没说多线程呀,帖子说的是 "因为 single threaded 只是可以让 Node 的代码 access : shared variables 时候不用 lock"。都不用 lock 了,所以所谓 "平行执行的 : callbacks" 还是在 single threaded 的主 thread 执行的 (可以算是虚拟平行执行) : ,这些执行流程 access shared variable 的问题,是说如果那个 shared variable : 是 mutable 的话,多个 (虚拟平行执行的) callbacks 可能修改这个 variable 而不 : 互相通知。 : 所以用 closure access external mutable variable 才是有可能有危险的。 : 我觉得 WebStorm 的 warning 还是挺靠谱的。
|
h**j 发帖数: 2033 | 16 没什么危险,你大概是想太多了,是会有可能多个callbacks来修改,但也还是按某个
顺序挨个来的。
javascript历来就是这样,也不是到了node才有的。
access
【在 d*******r 的大作中提到】 : 没说多线程呀,帖子说的是 "因为 single threaded 只是可以让 Node 的代码 access : shared variables 时候不用 lock"。都不用 lock 了,所以所谓 "平行执行的 : callbacks" 还是在 single threaded 的主 thread 执行的 (可以算是虚拟平行执行) : ,这些执行流程 access shared variable 的问题,是说如果那个 shared variable : 是 mutable 的话,多个 (虚拟平行执行的) callbacks 可能修改这个 variable 而不 : 互相通知。 : 所以用 closure access external mutable variable 才是有可能有危险的。 : 我觉得 WebStorm 的 warning 还是挺靠谱的。
|
c********l 发帖数: 8138 | 17 你说的问题,python早就考虑到了
python的闭包,callback 函数只能读闭包的变量,不能写或改变闭包的变量
既然node.js已经这么设计了,你就不用追究node的设计人的设计理念
而是从实用角度出发:既然node.js已经设计成目前样子了,我们应该如何编程,才
能最大化适应node.js
依我看,
1,尽量在node.js中避免使用闭包变量
2,如果需要修改闭包变量,必须上lock
【在 d*******r 的大作中提到】 : 一个帖子,转来大家讨论一下 : 最近使用 closure 和 anonymous function 遇到些问题, 大家探讨一下。 : 简单说就是当临时写一个 closure 或者 anonymous function 当 callback 使用时候 : ,如果让这个 closure access 了 external scope 里面的 variable, 就容易出现 " : access mutable variable " 的问题 (WebStorm 就会报 warning). : 比如这个帖子里面描述的例子: : http://samwize.com/2013/09/01/how-you-can-pass-a-variable-into- : 里面的 callback 引用并使用了 external scope 里面的 i, 所以出错了。 : 他是通过用 bind( {i: i} ) 将 i 的值传入注册时候的 callback 来解决的,当然也 : 有其他方案, 比如将 dummy(i, function(response)) 改成 dummy(i, function(
|
h**j 发帖数: 2033 | 18 node不需要,也没有lock啊
【在 c********l 的大作中提到】 : 你说的问题,python早就考虑到了 : python的闭包,callback 函数只能读闭包的变量,不能写或改变闭包的变量 : 既然node.js已经这么设计了,你就不用追究node的设计人的设计理念 : 而是从实用角度出发:既然node.js已经设计成目前样子了,我们应该如何编程,才 : 能最大化适应node.js : 依我看, : 1,尽量在node.js中避免使用闭包变量 : 2,如果需要修改闭包变量,必须上lock
|
p*****2 发帖数: 21240 | 19
上lock?我的世界观要崩溃了。
【在 c********l 的大作中提到】 : 你说的问题,python早就考虑到了 : python的闭包,callback 函数只能读闭包的变量,不能写或改变闭包的变量 : 既然node.js已经这么设计了,你就不用追究node的设计人的设计理念 : 而是从实用角度出发:既然node.js已经设计成目前样子了,我们应该如何编程,才 : 能最大化适应node.js : 依我看, : 1,尽量在node.js中避免使用闭包变量 : 2,如果需要修改闭包变量,必须上lock
|
c********l 发帖数: 8138 | 20 我的lock不是指node.js语言本身提供的lock,而是一种广义的lock
多机instance,尤其是load balancer后面多个web server,
若是同时修改同一数据,难道不上lock?
不上lock才要崩溃
【在 p*****2 的大作中提到】 : : 上lock?我的世界观要崩溃了。
|
|
|
p*****2 发帖数: 21240 | 21
你太搞了。
【在 c********l 的大作中提到】 : 我的lock不是指node.js语言本身提供的lock,而是一种广义的lock : 多机instance,尤其是load balancer后面多个web server, : 若是同时修改同一数据,难道不上lock? : 不上lock才要崩溃
|
d*******r 发帖数: 3299 | 22 我知道是按照某个顺序修改的 (因为 single threaded),但是如果你一段closure函数
里面,正在使用一个变量,但是不确定这个变量的值,那不是很容易写出逻辑错误。这
个确实是JS的老pattern了,网上很多帖子讨论的,我是JS新手,最近才学到。
【在 h**j 的大作中提到】 : 没什么危险,你大概是想太多了,是会有可能多个callbacks来修改,但也还是按某个 : 顺序挨个来的。 : javascript历来就是这样,也不是到了node才有的。 : : access
|
p*****2 发帖数: 21240 | 23 变量的值总是最新的 有啥不确定的? node让并发编程极其容易。
【在 d*******r 的大作中提到】 : 我知道是按照某个顺序修改的 (因为 single threaded),但是如果你一段closure函数 : 里面,正在使用一个变量,但是不确定这个变量的值,那不是很容易写出逻辑错误。这 : 个确实是JS的老pattern了,网上很多帖子讨论的,我是JS新手,最近才学到。
|
n****1 发帖数: 1136 | 24 楼主的担心是很合理的. 说node不用锁,就等于说单核电脑上的代码不用锁一样... |
p*****2 发帖数: 21240 | 25
两码事
【在 n****1 的大作中提到】 : 楼主的担心是很合理的. 说node不用锁,就等于说单核电脑上的代码不用锁一样...
|
d*******r 发帖数: 3299 | 26 二爷我没有 bash Node 呀,Node 确实写并发挺方便的,特别是各种 Net/File IO,最
近用着确实挺爽的.
我只是觉得写 JS Closure 的时候,我需要注意这个 access external mutable
variables 的问题。
刚刚扫了一眼 CoffeeScript, Coffee 有个 do 关键词就是跟这个有关.
http://coffeescript.org/
When using a JavaScript loop to generate functions, it's common to insert a
closure wrapper in order to ensure that loop variables are closed over, and
all the generated functions don't just share the final values. CoffeeScript
provides the do keyword, which immediately invokes a passed function,
forwarding any arguments.
这里这个例子比官方那个更详细点
http://rzrsharp.net/2011/06/27/what-does-coffeescripts-do-do.ht
【在 p*****2 的大作中提到】 : 变量的值总是最新的 有啥不确定的? node让并发编程极其容易。
|
p*****2 发帖数: 21240 | 27
a
and
CoffeeScript
我感觉你还没有熟悉Node。Node其实挺简单的,就是异步,你这个想明白了,你说的东
西都不是问题了。你现在还用同步的思路想Node,所以纠结。其实根据我的观察,这个
纠结也就是1,2天的事。
【在 d*******r 的大作中提到】 : 二爷我没有 bash Node 呀,Node 确实写并发挺方便的,特别是各种 Net/File IO,最 : 近用着确实挺爽的. : 我只是觉得写 JS Closure 的时候,我需要注意这个 access external mutable : variables 的问题。 : 刚刚扫了一眼 CoffeeScript, Coffee 有个 do 关键词就是跟这个有关. : http://coffeescript.org/ : When using a JavaScript loop to generate functions, it's common to insert a : closure wrapper in order to ensure that loop variables are closed over, and : all the generated functions don't just share the final values. CoffeeScript : provides the do keyword, which immediately invokes a passed function,
|
d*******r 发帖数: 3299 | 28 都纠结 2 个多星期了,哈哈
不过总体来说还是觉得 Node 很爽, 而且整个生态圈发展势头太好了
【在 p*****2 的大作中提到】 : : a : and : CoffeeScript : 我感觉你还没有熟悉Node。Node其实挺简单的,就是异步,你这个想明白了,你说的东 : 西都不是问题了。你现在还用同步的思路想Node,所以纠结。其实根据我的观察,这个 : 纠结也就是1,2天的事。
|
p*****2 发帖数: 21240 | 29
这个你慢慢就知道了,好处远远大于你这点迷惑。Node是thread safe的,multi
thread的一堆破问题,在node里你根本没有必要worry。
【在 d*******r 的大作中提到】 : 都纠结 2 个多星期了,哈哈 : 不过总体来说还是觉得 Node 很爽, 而且整个生态圈发展势头太好了
|
t*********h 发帖数: 941 | 30 这是js入门问题啊 应该是学习2,3天后就应该碰到并理解的了 js不是一直就这样吗
异步的 js的scope是function level的 搞一个function closure就完了
【在 d*******r 的大作中提到】 : 一个帖子,转来大家讨论一下 : 最近使用 closure 和 anonymous function 遇到些问题, 大家探讨一下。 : 简单说就是当临时写一个 closure 或者 anonymous function 当 callback 使用时候 : ,如果让这个 closure access 了 external scope 里面的 variable, 就容易出现 " : access mutable variable " 的问题 (WebStorm 就会报 warning). : 比如这个帖子里面描述的例子: : http://samwize.com/2013/09/01/how-you-can-pass-a-variable-into- : 里面的 callback 引用并使用了 external scope 里面的 i, 所以出错了。 : 他是通过用 bind( {i: i} ) 将 i 的值传入注册时候的 callback 来解决的,当然也 : 有其他方案, 比如将 dummy(i, function(response)) 改成 dummy(i, function(
|
|
|
p*****2 发帖数: 21240 | 31
终于有大牛过来说句公道话了。2,3天很靠谱呀。我观察了好几个人了,基本就是这个
节奏。
【在 t*********h 的大作中提到】 : 这是js入门问题啊 应该是学习2,3天后就应该碰到并理解的了 js不是一直就这样吗 : 异步的 js的scope是function level的 搞一个function closure就完了
|
t*********h 发帖数: 941 | 32 大牛好 这个确实写任何event handler或者callback就会碰到的 我自己就是初学js就
困惑了 就彻底学习了一下
【在 p*****2 的大作中提到】 : : 终于有大牛过来说句公道话了。2,3天很靠谱呀。我观察了好几个人了,基本就是这个 : 节奏。
|
p*****2 发帖数: 21240 | 33
赞大牛。
【在 t*********h 的大作中提到】 : 大牛好 这个确实写任何event handler或者callback就会碰到的 我自己就是初学js就 : 困惑了 就彻底学习了一下
|
d*******r 发帖数: 3299 | 34 这个确实一开始用 JS 就难受着,只是那会儿在折腾糙烂的 webpage 上的 JS,没花时
间来仔细看. |
d*******r 发帖数: 3299 | 35 其实在 Node 出来之前,我就用过这种类似的 single thread 的框架,OpenFlow
Controller 的框架,C/C++ & Python 的, 专门处理 Network IO 的,single
threaded scheduling + event handler。还自带 yield,所以写起 Application 来
,比 Node 还要直白。所以 Node 加入 yield 是在正路上.
【在 p*****2 的大作中提到】 : : 赞大牛。
|
d*******r 发帖数: 3299 | 36 这个才是最有意思的部分,意思是说很多 concurrent 模型本质上是有相似性的,
我 review 了一下整个帖子,发现根本没人讨论这个。这个帖子搞得太无趣了。
through
种
【在 d*******r 的大作中提到】 : 我是觉得这个理解比较有意思: : 如果想 callback 里的逻辑使用 callback 注册时候的 someObjectRef 的值,岂不是 : 传入 callback 的时候就得 copy/clone someObjectRef 当时的值? : 这样做的话,就有点像其他 concurrent 模型里面的 "send a variable copy through : a message, but not give reference to the variable". 也就是说,Node.js 这种 : single threaded 的模型,其实也是要隐性处理 issue of accessing shared : variables 的.
|
p*****2 发帖数: 21240 | 37 我觉得是错误的 不值得讨论
【在 d*******r 的大作中提到】 : 这个才是最有意思的部分,意思是说很多 concurrent 模型本质上是有相似性的, : 我 review 了一下整个帖子,发现根本没人讨论这个。这个帖子搞得太无趣了。 : : through : 种
|
d*******r 发帖数: 3299 | 38 各人保持自己观点吧~~
【在 p*****2 的大作中提到】 : 我觉得是错误的 不值得讨论
|
p*****2 发帖数: 21240 | 39
所以没人愿意讨论呀。没有必要争这个。
【在 d*******r 的大作中提到】 : 各人保持自己观点吧~~
|
d******k 发帖数: 28 | 40 似乎楼主对concurrent问题的理解还不够。
concurrent的问题是thread A在执行时,另一个thread B 跑进来把共享的数据修改了
,那thread A的逻辑就会出问题,比如
thread A:
if (thisGirl.isMarried === false)
{
//threadB 这时跑进来把她娶了
marryHer(); //一女共侍二夫了
}
如果是single thread, 就算是callback在不确定的时间执行这段code, isMarried的值
是不确定,但逻辑完全没有问题,不会有3P的问题存在。 |
|
|
d*******r 发帖数: 3299 | 41 你太小看楼主了... 你这个是 TA 给 CS10X 补课呢 ...
你仔细看帖了么...
【在 d******k 的大作中提到】 : 似乎楼主对concurrent问题的理解还不够。 : concurrent的问题是thread A在执行时,另一个thread B 跑进来把共享的数据修改了 : ,那thread A的逻辑就会出问题,比如 : thread A: : if (thisGirl.isMarried === false) : { : //threadB 这时跑进来把她娶了 : marryHer(); //一女共侍二夫了 : } : 如果是single thread, 就算是callback在不确定的时间执行这段code, isMarried的值
|
d******k 发帖数: 28 | 42 失敬。
或者这么说吧。人有时候会在某个角拐不过弯来,而在别人看来,那里根本就没有角。
这个问题人人都会发生,我自己也会。琢磨琢磨就会想通了。
比如你下面的说法:
>>>我知道是按照某个顺序修改的 (因为 single threaded),但是如果你一段closure
函数
>>> 里面,正在使用一个变量,但是不确定这个变量的值,那不是很容易写出逻辑错误
。这
>>> 个确实是JS的老pattern了,网上很多帖子讨论的,我是JS新手,最近才学到。
你现在认为的角,其实跟Node 没关系,跟closure没关系,跟concurrent也没关系。 而
是对变量的理解。就像Peking2说的,变量的值本来就是变的,本来就是不确定的。何
需担心。
【在 d*******r 的大作中提到】 : 你太小看楼主了... 你这个是 TA 给 CS10X 补课呢 ... : 你仔细看帖了么...
|
p*****2 发帖数: 21240 | 43 靠 这个解释太高了
closure
【在 d******k 的大作中提到】 : 失敬。 : 或者这么说吧。人有时候会在某个角拐不过弯来,而在别人看来,那里根本就没有角。 : 这个问题人人都会发生,我自己也会。琢磨琢磨就会想通了。 : 比如你下面的说法: : >>>我知道是按照某个顺序修改的 (因为 single threaded),但是如果你一段closure : 函数 : >>> 里面,正在使用一个变量,但是不确定这个变量的值,那不是很容易写出逻辑错误 : 。这 : >>> 个确实是JS的老pattern了,网上很多帖子讨论的,我是JS新手,最近才学到。 : 你现在认为的角,其实跟Node 没关系,跟closure没关系,跟concurrent也没关系。 而
|
d*******r 发帖数: 3299 | 44 其实是这样的,有很多变量本来就是拿来所有 模块/进程/host 共享和修改的,比如故
意全局共享的一些状态,或者 remote 端的 DB 里面的一些值,这个确实对所有语言都
一样。这样的话,在任何一个范围内 (e.g. event handler),你 access 这些变量,
都是可能被别的执行单元 (e.g. event handler) 修改过,对这些修改是有心里准备的。
我说那种,还是属于吴用了 Node, 然后觉得这些变量在某个范围内,是不会修改的,
然后其实被修改了,然后逻辑就出错了。还是跟 Node 有关的。想想主要还是async的
注册/执行 event handler 的时间差造成的。消除这个时间差的一个简便办法,就是注
册 event handler 的时候,就 copy 当时想访问的变量的值。
closure
【在 d******k 的大作中提到】 : 失敬。 : 或者这么说吧。人有时候会在某个角拐不过弯来,而在别人看来,那里根本就没有角。 : 这个问题人人都会发生,我自己也会。琢磨琢磨就会想通了。 : 比如你下面的说法: : >>>我知道是按照某个顺序修改的 (因为 single threaded),但是如果你一段closure : 函数 : >>> 里面,正在使用一个变量,但是不确定这个变量的值,那不是很容易写出逻辑错误 : 。这 : >>> 个确实是JS的老pattern了,网上很多帖子讨论的,我是JS新手,最近才学到。 : 你现在认为的角,其实跟Node 没关系,跟closure没关系,跟concurrent也没关系。 而
|
h**j 发帖数: 2033 | 45 大牛开始搞c*了么 等你分享心得呢
的。
【在 d*******r 的大作中提到】 : 其实是这样的,有很多变量本来就是拿来所有 模块/进程/host 共享和修改的,比如故 : 意全局共享的一些状态,或者 remote 端的 DB 里面的一些值,这个确实对所有语言都 : 一样。这样的话,在任何一个范围内 (e.g. event handler),你 access 这些变量, : 都是可能被别的执行单元 (e.g. event handler) 修改过,对这些修改是有心里准备的。 : 我说那种,还是属于吴用了 Node, 然后觉得这些变量在某个范围内,是不会修改的, : 然后其实被修改了,然后逻辑就出错了。还是跟 Node 有关的。想想主要还是async的 : 注册/执行 event handler 的时间差造成的。消除这个时间差的一个简便办法,就是注 : 册 event handler 的时候,就 copy 当时想访问的变量的值。 : : closure
|
d******k 发帖数: 28 | |
d*******r 发帖数: 3299 | 47 还没... 还在折腾 mongo...
看二爷有啥新见解没?
【在 h**j 的大作中提到】 : 大牛开始搞c*了么 等你分享心得呢 : : 的。
|
p*****2 发帖数: 21240 | 48 社区真不错
【在 d*******r 的大作中提到】 : 还没... 还在折腾 mongo... : 看二爷有啥新见解没?
|
c*********e 发帖数: 16335 | 49 可以存在一个queue里,先进先出,每次pop出去一个。
【在 d*******r 的大作中提到】 : 一个帖子,转来大家讨论一下 : 最近使用 closure 和 anonymous function 遇到些问题, 大家探讨一下。 : 简单说就是当临时写一个 closure 或者 anonymous function 当 callback 使用时候 : ,如果让这个 closure access 了 external scope 里面的 variable, 就容易出现 " : access mutable variable " 的问题 (WebStorm 就会报 warning). : 比如这个帖子里面描述的例子: : http://samwize.com/2013/09/01/how-you-can-pass-a-variable-into- : 里面的 callback 引用并使用了 external scope 里面的 i, 所以出错了。 : 他是通过用 bind( {i: i} ) 将 i 的值传入注册时候的 callback 来解决的,当然也 : 有其他方案, 比如将 dummy(i, function(response)) 改成 dummy(i, function(
|
d*******r 发帖数: 3299 | 50 我去, 怎么想起挖这个坟 :D
【在 c*********e 的大作中提到】 : 可以存在一个queue里,先进先出,每次pop出去一个。
|
|
|
c*********e 发帖数: 16335 | 51 消除这个时间差的一个简便办法,也可以用hashtable啊。现在hashtable太热了,什么
map-reduce, nosql都是用的它。
的。
【在 d*******r 的大作中提到】 : 其实是这样的,有很多变量本来就是拿来所有 模块/进程/host 共享和修改的,比如故 : 意全局共享的一些状态,或者 remote 端的 DB 里面的一些值,这个确实对所有语言都 : 一样。这样的话,在任何一个范围内 (e.g. event handler),你 access 这些变量, : 都是可能被别的执行单元 (e.g. event handler) 修改过,对这些修改是有心里准备的。 : 我说那种,还是属于吴用了 Node, 然后觉得这些变量在某个范围内,是不会修改的, : 然后其实被修改了,然后逻辑就出错了。还是跟 Node 有关的。想想主要还是async的 : 注册/执行 event handler 的时间差造成的。消除这个时间差的一个简便办法,就是注 : 册 event handler 的时候,就 copy 当时想访问的变量的值。 : : closure
|
d*******r 发帖数: 3299 | 52 申明闭包时候, copy 原值传入就是, 跟用什么数据结构无关
【在 c*********e 的大作中提到】 : 消除这个时间差的一个简便办法,也可以用hashtable啊。现在hashtable太热了,什么 : map-reduce, nosql都是用的它。 : : 的。
|
b********0 发帖数: 62 | 53 经典问题 下面这个文章里有讨论
http://book.mixu.net/node/ch4.html
你的帖子里 那个人没搞清楚 例子里根本没有closure
所以和mutable closure没啥关系
【在 d*******r 的大作中提到】 : 一个帖子,转来大家讨论一下 : 最近使用 closure 和 anonymous function 遇到些问题, 大家探讨一下。 : 简单说就是当临时写一个 closure 或者 anonymous function 当 callback 使用时候 : ,如果让这个 closure access 了 external scope 里面的 variable, 就容易出现 " : access mutable variable " 的问题 (WebStorm 就会报 warning). : 比如这个帖子里面描述的例子: : http://samwize.com/2013/09/01/how-you-can-pass-a-variable-into- : 里面的 callback 引用并使用了 external scope 里面的 i, 所以出错了。 : 他是通过用 bind( {i: i} ) 将 i 的值传入注册时候的 callback 来解决的,当然也 : 有其他方案, 比如将 dummy(i, function(response)) 改成 dummy(i, function(
|