由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 关于闭包,我发明了一个绝妙陷阱
相关主题
感觉vert.x上的callback hell比node上还要更丑陋node callback的误解
function pointer 和 call-back function 有什么区别?做大项目的话,有两个语言features是杀手
Node.js 并发模型相关:closure 中 access mutable variableJava Streams vs C# LINQ vs Java6
node.js错误求指点真正对异步有需求的应该是游戏类服务器
node 求算法inline functions in C++
请教一下:Javascript callback not workingHow can matlab loop over functions
如何定义 Javascript overload function ?A C++ private member function problem
node promise发出reject之后,是不是只能hit catch block ?virtual function question
相关话题的讨论汇总
话题: var话题: function话题: functions话题: 陷阱话题: 闭包
进入Programming版参与讨论
1 (共1页)
c********l
发帖数: 8138
1
这个陷阱,我敢说,如果不亲自run一遍,根本答不对
完全能够枪毙所有的阿三
给定javascript程序:
var functions = [];
(function foo() {
for (var i=0; i<5; i++ ) {
var f = function() {
console.log(i);
}
functions.push(f);
}
for (var i=0; i<5; i++ ) {
f = new Function("console.log(i);");
functions.push(f);
}
})();
for (var i=0; i<10; i++ ) {
functions[i]();
}
问最后的console会输出什么?
我不需要读者贴答案,
因为随便一个读者只要直接在chrome里面跑一遍马上出结果,都不需要IDE
关键是需要体会陷阱的奥妙
r****y
发帖数: 26819
2
这个例子偏简单了,看了good parts那本书第37页就知道答案。还可再复杂点。

【在 c********l 的大作中提到】
: 这个陷阱,我敢说,如果不亲自run一遍,根本答不对
: 完全能够枪毙所有的阿三
: 给定javascript程序:
: var functions = [];
: (function foo() {
: for (var i=0; i<5; i++ ) {
: var f = function() {
: console.log(i);
: }
: functions.push(f);

q*c
发帖数: 9453
3
这种东西越发说明闭包这玩意就像 ++i+i++ 这些奇技淫巧一样。

【在 c********l 的大作中提到】
: 这个陷阱,我敢说,如果不亲自run一遍,根本答不对
: 完全能够枪毙所有的阿三
: 给定javascript程序:
: var functions = [];
: (function foo() {
: for (var i=0; i<5; i++ ) {
: var f = function() {
: console.log(i);
: }
: functions.push(f);

g****r
发帖数: 1589
4
i++这种不是必须的东西
闭包用好了还是有用的,不搞明白了很容易自己都不知道程序运行结果是怎么回事

【在 q*c 的大作中提到】
: 这种东西越发说明闭包这玩意就像 ++i+i++ 这些奇技淫巧一样。
c********l
发帖数: 8138
5
这个例子没有你想象得那么简单。包含了至少两个子陷阱。那本good parts只提了其中一
个sub trap。你可以先心算结果,再和浏览器比较一遍。

【在 r****y 的大作中提到】
: 这个例子偏简单了,看了good parts那本书第37页就知道答案。还可再复杂点。
c********l
发帖数: 8138
6
那些什么二叉平衡树其实也差不多,平时根本用不着
至于p=np更如此

【在 q*c 的大作中提到】
: 这种东西越发说明闭包这玩意就像 ++i+i++ 这些奇技淫巧一样。
z*******3
发帖数: 13709
7
不不,p!=np上升到了基础数学高度
是证明题,不是计算题,数学应用本身有很多领域,不仅仅是cs

【在 c********l 的大作中提到】
: 那些什么二叉平衡树其实也差不多,平时根本用不着
: 至于p=np更如此

z*******3
发帖数: 13709
8
上次看到有个谁说写lips很爽
想听听他怎么说这个哈
p*****2
发帖数: 21240
9
这个不算太难理解吧?有JS经验的应该都能推出来吧?
a*****e
发帖数: 1700
10
你这个坑挖得不够深,仅仅涉及到了 scoping 的问题。还要加上 global var/local
var/mutation 才全面。
试试这个:
var functions = [];
(function foo() {
for (var i=0; i<5; i++ ) {
var f = function() {
console.log(i);
}
functions.push(f);
}
for (var i=0; i<5; i++ ) {
var f = function() {
var j = i; console.log(j);
}
functions.push(f);
}
for (var i=0; i<5; i++ ) {
var f = function() {
i++; console.log(i);
}
functions.push(f);
}
for (var i=0; i<5; i++ ) {
f = function () {
var j = i; j++; console.log(j);
}
functions.push(f);
}
})();
for (var i=0; i<20; i++ ) {
functions[i]();
}

【在 c********l 的大作中提到】
: 这个陷阱,我敢说,如果不亲自run一遍,根本答不对
: 完全能够枪毙所有的阿三
: 给定javascript程序:
: var functions = [];
: (function foo() {
: for (var i=0; i<5; i++ ) {
: var f = function() {
: console.log(i);
: }
: functions.push(f);

相关主题
请教一下:Javascript callback not workingnode callback的误解
如何定义 Javascript overload function ?做大项目的话,有两个语言features是杀手
node promise发出reject之后,是不是只能hit catch block ?Java Streams vs C# LINQ vs Java6
进入Programming版参与讨论
c********l
发帖数: 8138
11
你把“new Function”那段给漏了
这是第二个sub trap,这比第一个sub trap更隐晦
again,我还是建议你们先想一个答案,再真正在console里面run一遍
我觉得我估计这道题不但要kill掉所有的阿三,还要kill掉所有的老中。

【在 a*****e 的大作中提到】
: 你这个坑挖得不够深,仅仅涉及到了 scoping 的问题。还要加上 global var/local
: var/mutation 才全面。
: 试试这个:
: var functions = [];
: (function foo() {
: for (var i=0; i<5; i++ ) {
: var f = function() {
: console.log(i);
: }
: functions.push(f);

a*****e
发帖数: 1700
12
这种东西只是暴露了这些个语言的设计者的知识缺陷。
闭包从lisp开始就有明确的语义和实现方法,只是需要学习一点程序语言的基础理论知
识而已。
什么是民科,看看 JS 的设计就知道了,不只是闭包,坑多了去了。

【在 q*c 的大作中提到】
: 这种东西越发说明闭包这玩意就像 ++i+i++ 这些奇技淫巧一样。
b***e
发帖数: 1419
13
5 5 5 5 5 5 6 7 8 9
不过, 谁写第一种可以教。谁写第二种的立刻开除。

【在 c********l 的大作中提到】
: 你把“new Function”那段给漏了
: 这是第二个sub trap,这比第一个sub trap更隐晦
: again,我还是建议你们先想一个答案,再真正在console里面run一遍
: 我觉得我估计这道题不但要kill掉所有的阿三,还要kill掉所有的老中。

q*c
发帖数: 9453
14
闭包更加不是必须的东西。

【在 g****r 的大作中提到】
: i++这种不是必须的东西
: 闭包用好了还是有用的,不搞明白了很容易自己都不知道程序运行结果是怎么回事

t***t
发帖数: 6066
15
p=np是最深刻的计算机理论之一。解决了将是最大突破之一,居然被你如此评论。

【在 c********l 的大作中提到】
: 那些什么二叉平衡树其实也差不多,平时根本用不着
: 至于p=np更如此

h*****a
发帖数: 1718
16
p基本上不可能等于np,只不过是什么时候能证明出来的问题。

【在 t***t 的大作中提到】
: p=np是最深刻的计算机理论之一。解决了将是最大突破之一,居然被你如此评论。
g****r
发帖数: 1589
17
不觉得,没有闭包,写各种callback和lamada至少得多写5倍代码,像Java就得搞一堆
匿名类出来

【在 q*c 的大作中提到】
: 闭包更加不是必须的东西。
z****e
发帖数: 54598
18
java其实除了搞ui的
其他人不怎么用匿名类
现在也就是android那些人用得多
server side很多时候不用

【在 g****r 的大作中提到】
: 不觉得,没有闭包,写各种callback和lamada至少得多写5倍代码,像Java就得搞一堆
: 匿名类出来

z****e
发帖数: 54598
19
java8 有lambda了
以后可以少写很多匿名类

【在 g****r 的大作中提到】
: 不觉得,没有闭包,写各种callback和lamada至少得多写5倍代码,像Java就得搞一堆
: 匿名类出来

g****r
发帖数: 1589
20
呵呵,出来我也去瞧瞧

【在 z****e 的大作中提到】
: java8 有lambda了
: 以后可以少写很多匿名类

相关主题
真正对异步有需求的应该是游戏类服务器A C++ private member function problem
inline functions in C++virtual function question
How can matlab loop over functionsabout STL functor and function pointers
进入Programming版参与讨论
t***t
发帖数: 6066
21
最近写一个parser, 觉得纳母达还是很有用的。现在我不得不写很冗长的类。其实我就
想移进,reduce等等。但是不得不每个action写个类。

【在 g****r 的大作中提到】
: 不觉得,没有闭包,写各种callback和lamada至少得多写5倍代码,像Java就得搞一堆
: 匿名类出来

q*c
发帖数: 9453
22
写代码那点时间根本不算啥~和轻松读懂代码,不出错比较。
担心代码行数实在是我无法理解的事情。 何况也没有5倍那么多,何况整体更是不多。

【在 g****r 的大作中提到】
: 不觉得,没有闭包,写各种callback和lamada至少得多写5倍代码,像Java就得搞一堆
: 匿名类出来

t***t
发帖数: 6066
23
99%的人估计都这么认为。
但是,这么直觉上正确的事就是没法证明,让我觉得一旦证出,这个证明本身将是极其
重要
的,影响极大的。

【在 h*****a 的大作中提到】
: p基本上不可能等于np,只不过是什么时候能证明出来的问题。
g****r
发帖数: 1589
24
我不觉得可读性有啥问题,可读性都是和编程习惯有关的,不管啥代码特性滥用了都会
有可读性问题,各种语言特性都是有相应的编码规范结合来用的,OO的编程规范
pattern之类的更多,只不过训练讨论的更多,现在基本不会有谁写出可读性很差的OO
来罢了。所以可读性从来都是程序员的问题,你非要滥用语言的特性就不要怪别人
就比如你写一堆i++i++i++当然谁都看不懂
你就正常点写个i++, i--有谁会看不懂?
闭包正常写都是很一目了然的。我不相信有了i++,你还会去写i=i+1,虽然就差俩字符
,有简单的为啥不用简单的,程序员都是懒人

【在 q*c 的大作中提到】
: 写代码那点时间根本不算啥~和轻松读懂代码,不出错比较。
: 担心代码行数实在是我无法理解的事情。 何况也没有5倍那么多,何况整体更是不多。

p*****2
发帖数: 21240
25

OO
顶大牛

【在 g****r 的大作中提到】
: 我不觉得可读性有啥问题,可读性都是和编程习惯有关的,不管啥代码特性滥用了都会
: 有可读性问题,各种语言特性都是有相应的编码规范结合来用的,OO的编程规范
: pattern之类的更多,只不过训练讨论的更多,现在基本不会有谁写出可读性很差的OO
: 来罢了。所以可读性从来都是程序员的问题,你非要滥用语言的特性就不要怪别人
: 就比如你写一堆i++i++i++当然谁都看不懂
: 你就正常点写个i++, i--有谁会看不懂?
: 闭包正常写都是很一目了然的。我不相信有了i++,你还会去写i=i+1,虽然就差俩字符
: ,有简单的为啥不用简单的,程序员都是懒人

h****r
发帖数: 2056
26
最深刻的数学猜想之一,意义远高于计算机理论。
任何在计算机行当里混的人是没有智力解决这个猜想的。得等纯数学的天才出手。
这其实是个哲学问题: 你解决不了在当前层次面临的问题,只有到了更高一层才能解
决。

【在 t***t 的大作中提到】
: p=np是最深刻的计算机理论之一。解决了将是最大突破之一,居然被你如此评论。
r****y
发帖数: 26819
27
除了第一部分,后面那部分没有什么陷阱啊。完全是用字符串创建一个Function objec
t的用法。关键是调用这些创建的Function object时,i是个全局变量,简直都想不出
还能有什么其它可能性。所以太简单了。完全等于这样:
f = new Function("console.log(i)");
i = 5;
f();
f = new Function("console.log(i)");
i = 6;
f();
...
就这个,版上多少人会写不出答案来?

【在 c********l 的大作中提到】
: 这个陷阱,我敢说,如果不亲自run一遍,根本答不对
: 完全能够枪毙所有的阿三
: 给定javascript程序:
: var functions = [];
: (function foo() {
: for (var i=0; i<5; i++ ) {
: var f = function() {
: console.log(i);
: }
: functions.push(f);

x****u
发帖数: 44466
28
我压10伪币这个问题最终不是人类独立解决的。

【在 h****r 的大作中提到】
: 最深刻的数学猜想之一,意义远高于计算机理论。
: 任何在计算机行当里混的人是没有智力解决这个猜想的。得等纯数学的天才出手。
: 这其实是个哲学问题: 你解决不了在当前层次面临的问题,只有到了更高一层才能解
: 决。

h*****a
发帖数: 1718
29
和什么动物或者植物一起合作能解决?:)

【在 x****u 的大作中提到】
: 我压10伪币这个问题最终不是人类独立解决的。
t***t
发帖数: 6066
30
you mean god?

【在 x****u 的大作中提到】
: 我压10伪币这个问题最终不是人类独立解决的。
1 (共1页)
进入Programming版参与讨论
相关主题
virtual function questionnode 求算法
about STL functor and function pointers请教一下:Javascript callback not working
为什么貌似objective C比c++要火?如何定义 Javascript overload function ?
aspect programing 就是 functional programing吗?node promise发出reject之后,是不是只能hit catch block ?
感觉vert.x上的callback hell比node上还要更丑陋node callback的误解
function pointer 和 call-back function 有什么区别?做大项目的话,有两个语言features是杀手
Node.js 并发模型相关:closure 中 access mutable variableJava Streams vs C# LINQ vs Java6
node.js错误求指点真正对异步有需求的应该是游戏类服务器
相关话题的讨论汇总
话题: var话题: function话题: functions话题: 陷阱话题: 闭包