如果作者具有一定的 Node.js 功底,并且确实文章中有干货的话,那么帖子就可以加精华。
当然每个人的干货都会夹带着自己的偏好。这时候评论中各种想法的碰撞也是值得一看的。
最近的几个帖子,争议比较大,一方面是因为各位对于异步范式的喜好不同,一方面也是因为该作者言辞比较激烈。
对于前者,百花齐放挺好。但是对于后者,我也在劝作者适当缓和一下言辞。
所以说这个帖子有什么干活(别打我~~~~(>_<)~~~~ )
评论真的很精彩,虽然言语犀利了点儿,但只有这种基情的碰撞,才能擦出爱的火花啊,哈哈~
@lgqlee 这帖子没加精华啊…置顶了而已…
个人觉得评价的依据应该还是文章的内容为主,node功底这个东西太虚了不好说,举个例子https://cnodejs.org/topic/550671cfc34008306435e30c
Rocore或许看在原创和分享的面子上,其他讨论事件编程的,版主你会写那样的代码么?你对event-proxy比较熟悉,你内心也应该有一个自己的评价。
或许我们应该更多一点质疑的声音,回调模式下的事件是不是一个错误?事件是不是应该运用到最合适的地方,而不是搞出自己绑定自己东西出来标新立异。事件是留给别人的接口,是让别人注册来使用的,event-proxy总不至于事件接口都不给人留吧。
node本身的模式都有被质疑的必要,更不要说这种错了没影子的东西了,加精不要紧,但评价还是慎重点好,那么多东西在那里,骂人的话可以删掉,但是技术上的讨论大家都可以去看。
@JexCheng 这是什么典故?
@JexCheng 我现在对node也是持批判态度的,我现在更愿意把他作为工具。感觉node就是libuv被javascript绑架的产物,很多东西很美好,但是又没那么美好。如果在这里讲javascript的不是,被喷的可能性是很大的,但这也许跟语言没有多大关系,而是因为语言被滥用了,或者说被自以为是的滥用了。
说一个很现实的问题,fibjs很热闹那会,我就在思考这个问题,如果一旦出现一个性能上不差,能够完美将异步转化为同步编程模式的东西出现,程序员们会不会再次用脚投票呢?我最后的结论是,node被抛弃不抛弃都是无关紧要的,最紧要的是我们能够提升自己,尽自己最大的努力去探究底层的,这样不管上层的东西如何变,我们自然可以以不变应万变了。fibjs不知道能不能火,但如果fibjs能够更多的融入开源社区,机会肯定更大一点。
我又重新翻了翻那个帖子,我的确是被一个无所不通的人教训得像个小学生,但是回想起来了,自己年轻的时候,也是有过老子天下第一的阶段的,但随着年龄的增长,反而越来越不自信了,比自己牛逼的人海去了。读得代码越多,越觉得自己像个小学生。
@coordcn 所言极是。码农保有一颗对技术的敬畏之心,难得但可贵。
@coordcn 那什么语言美好呢?PHP?Java?Python?
什么语言没有缺陷,什么语言没有自身的优点。
的确如你所说,跟语言没多大关系,而跟用的人有关。Java 是好语言,但是被滥用了,名声就臭了,一个道理。
现在用 Node.js 写代码的人很多都不是科班出身的。实际上不是科班出身不要紧,可以慢慢来慢慢学,只是如果不是科班出身再加上态度上的问题的话,这样的人一多名声自然就臭了。
比如各种坑人的培训机构出来的各种 Java 的程序员、PHP 的程序员等等等等。
语言什么的都是次要的,这只是一种工具。而编程真正的灵魂在于思维和算法。
没有参与讨论,只是看了看,个人认为骂脏话什么的还能接受,这样才有激情么。但是人身攻击就如同脆弱而又放大的自尊心被触碰了一下,由此产生不和谐讨论方式终将脱离讨论话题,让气氛变了味
这帖子来得晚了些。
不过个人认为,大家都要注意为好,而不是一方的问题。@alsotang
@xadillax 我没有贬低javascript的意思,所有语言在我眼里都是工具,非要按自己的喜好排个次序,我的顺序是C,Lua,Javascript,很意外没有你列举的语言吧,我就是你所说的不是科班出身的人,不过我也庆幸自己没去过培训机构。有的时候,科班真的不是那么重要,自己喜欢远比科班出身重要,不是科班只是高考的时候分数差了那么几分而已。为了那几分,我用一生来弥补还不行么?
曾经我们说“我们不能打一辈子星际,但能做一辈子朋友”,是的我们不能打一辈子星际,但是我们可以编一辈子程序,不为别的,只因喜欢。
强烈同意编程真正的灵魂在于思维和算法,共勉。
个人觉得帖子是不是精华关键看能不能解决后来者的问题的基础精华,至于对技术本身的独到见解可以整个大牛精华 自豪地采用 CNodeJS ionic
和谐和谐
@coordcn 科班不科班是不重要。重要的是态度——很多人不是科班了还态度恶劣,自以为天下我有的感觉。
就我自己而言的话,顺序差不多,C / C++ / Node.js。
还有其它的一些形如 Clojure 之类的玩具。
不对读者友好,不对作者友好的帖子,一律不能加精。 自豪地采用 CNodeJS ionic
@fengmk2 收到
如果楼主的帖子也可以和评论一样+1, -1的话, 就可以用数据来说话了.
关于异步编程风格纯粹是个人习惯问题,似乎一直争论下去也不会有结果…… 跟缩进用两个空格还是四个空格的问题差不多
笑死人了,以为你TM是谁啊,一个小型的百度贴吧而已。
给你转个帖子,还当自己多大回事是的。
就一个阿里巴巴的小论坛,还把自己当回事呢。
阿里巴巴的程序员,在我那还真不是回事呢。
这个地方,源代码写的shi一样,流量b一样,装逼装的挺大。
我看我也学某人,闪的远远的吧。
菜比聚集地!!!
转帖列表上有这个地址就是个错误。
谢谢管理员几天前帮我整理了好几个代码格式。当时忙于辩论,没来得及感谢。补上。
本来见到烂人烂代码不断地被加精,正考虑鼓动别人另开根据地呢,或者从此少来这里,发现事情有变化,稍感欣慰。疾病邪恶腐烂绝对地有扩张性传染性,没有抗体是非常麻烦的事情,人没有抗体很难活过一整天。抗体比如T细胞,对待可疑物,在必要的时候完全是嫉恶如仇赶净杀绝(需要网友去识别、公开驳斥,不一定是管理员,但管理员需要有同样的警觉心),这样才稍微可以对抗身体的疾病和腐烂。
@coordcn JS是未来语言的发展方向。不要低看它啊,我几天前看过一篇分析文章就是这么说的,深以为然,可惜具体文章地址和观点不记得了。
未来的两大语言就是C(也许包括C++)和JS。
@tulayang 如果我是管理员,看到你说出这样的话,一定删你号了。第一次见到做技术的这么没素质。
让逼撕得更猛烈些吧 自豪地采用 CNodeJS ionic
@alsotang 我要报警!管理员快来管管!
我来插句嘴: 本以为做技术的同学应该都比较理智的…… 思路和习惯都没有绝对的好与坏,个人喜好罢了。 程序员不谈国事,不谈国事又有什么说不明百的呢? 希望这篇帖子能永远保留,程序员需要这种激情,只要不动刀子,吵两句嘴,正常!
@deemstone 我觉得还是打架吧,嘴上已经说的已经没用了。 :)
@tulayang 来社区就是为了交流,为了相互学习,相互帮忙。你觉得这样继续骂别人下去能解决问题吗?你换位思考一下,你是楼主,你看到这样的回复,心里还会和气地回复你吗?永远保持一颗菜鸟的心,才能不断地坚持学习。在一定场景你不是菜鸟,但是还了一个场景,你也可能是别人眼中的菜鸟。程序员社区应该是逻辑性比较好的集中地,没必要这样啊。你就消消气吧,如果你juede社区的同学对你不好,我在这里跟你陪个不是,请你原谅。 自豪地采用 CNodeJS ionic
不以成败论英雄,真正被人们铭记于心的英雄是那些身体力行把力量贡献给人们的普通人。 墙内的developers都知道一些nodejs的疑难杂症,大部分都是从这个小社区找到答案的。 我还是坚持 ,任何花费自己休息时间,整理文字,代码,分享到这个社区的人,都是值得尊重的!
@LongHorn-C 我没有低看javascript的意思,我自己的语言排序是C,Lua,Javascript,我个人不太看好从C++,可能我脑子不太灵光,对太过复杂的东西无法掌控,所以只能选择C。Lua之所以摆在javascript的前面,是因为我觉得相对于javascript,与c的绑定lua更简单一些。lua的很多概念跟javascript是类似的。这种选择其实跟个人能力有关,跟语言本身的优劣无关。
@tulayang 我想你完全误解大家的意思了,大家跟你的帖子,指出一些技术上的问题,根本不是对你个人有什么看法。程序员都比较顶真,但大多无恶意,也无贬低别人的意思,仔细思考一下吧,我想你是能分清楚的。
@dayuoba 尊重不可能这么廉价,尊重必须是对等的,指出问题未必就是不尊重,无视他人善意的提醒或许才是最大的不尊重。尊重是别人给的,自己要不来。
何必弄成这样呢 自豪地采用 CNodeJS ionic
凑合进来,霍霍,爱没有对错,爱她,就用好她。
冲动是魔鬼!冷静!
你好像很吊的样子,写了几年半残不残从shell脚本扣下来的PHP,做了几天网页,觉得自己懂编程了? 连PHP作者都TM说自己根本不懂如何设计一门语言。 Facebook天天花着流水般的钱,用C C++给这白痴才用的语言所写的源代码补窟窿。 你在这里天天穷BB你妈的逼呀! 给你爹学着点,EventEmitter的源代码是什么:
function EventEmitter() {
this._events = {};
}
EventEmitter.prototype.on = function (type, f) {
this._events[type] = f;
return this;
};
EventEmitter.prototype.emit = function (type/*, arg1, arg2, ...*/) {
this._events[type].apply(this, Array.prototype.slice.call(arguments, 1));
};
var eem = new EventEmitter();
eem
.on('A', function () {
console.log('A');
this.emit('B');
})
.on('B', function () {
console.log('B');
})
.emit('A');
就你,算你妈的比呀,闭包都搞不懂的傻逼!我下边一大堆学徒都能当你师傅。
@tulayang 你从哪里看出来我不懂闭包的?无可救药了。。。
赶快滚回家吃屎去。闭包是什么?孩子? C语言的static都出来了,傻逼孩子!
@tulayang 不要这个样子,技术交流大家都没恶意。你今年多大了?能做个自我介绍么?我现在对你倒比较好奇了,你这种状态肯定也属于少年得志的。技术上大家没有完全否定你的意思,我认为你还是那种对技术有追求的人,就是表达方式有些问题,什么屎啊尿的,我们文明人,不能好那口啊。
用代码来讲,你 === shit。 屁都不懂,瞎装你MDB。装也就罢了,还拉来C语言。你MGB你知道C语言是什么吗?
这就是你TMB的编程功力,装你M的逼呀,自己看看这是哪个SB写的代码: 看你TMB代码写的那穷酸相,连TMB空格都不带写的
function __walk(p, fn, regexp, dir, done){
fs.readdir(p, function(err, files){
if(err){
if(err.code === 'ENOENT'){
done(null, null);
}else if(err.code === 'ENOTDIR'){
if(!regexp || (regexp && regexp.test(p))){
fn(p, function(err1){
err1 ? done(err1) : done(null, p);
});
}else{
done(null, null);
}
}else{
done(err);
}
}else{
if(files.length){
var f = files.map(function(item){
return path.join(p, item);
});
tasks.map(f, function(item, callback){
fs.stat(item, function(err2, stat){
if(err2){
callback(err2);
}else if(stat.isFile()){
if(!regexp || (regexp && regexp.test(item))){
fn(item, function(err3){
err3 ? callback(err3) : callback(null, item);
});
}else{
callback(null, null);
}
}else if(stat.isDirectory()){
__walk(item, fn, regexp, dir, function(err4, files){
if(err4){
callback(err4);
}else{
callback(null, files);
}
});
}
});
}, function(err5, results){
if(err5){
done(err5);
}else{
if(dir){
if(!regexp || (regexp && regexp.test(p))){
fn(p, function(err6){
if(err6){
done(err6);
}else{
results.unshift(p);
done(null, results);
}
});
}else{
done(null, results);
}
}else{
done(null, results);
}
}
});
}else{
if(dir){
if(!regexp || (regexp && regexp.test(p))){
fn(p, function(err7){
err7 ? done(err7) : done(null, p);
});
}else{
done(null, null);
}
}else{
done(null, null);
}
}
}
});
}
@tulayang 做个类比不行么?从本质上讲,所有能够保持状态的值不都是存在内存里的?当然闭包肯定和static不是分配在一个地方的,static是编译器预先分配好的,生命周期是整个程序运行期,闭包可能是malloc出来的,不被外界引用就要还给系统。我认为他们都可以使函数保持状态,从这个方面说,他们类似有何不可?
放你M的大臭屁,你哪个老师教给你闭包这样解释的? static你妹啊,你知道C语言的static是干什么的吗?卧槽,奇葩!而且还有malloc,能再雷点吗?
@tulayang 我就这个能力了,能写到这样我都觉得很费劲了,你如果觉得代码太垃圾的话,自己也实现一个吧。
异步遍历目录和文件,很多朋友都有需求,有需求就值得去做,我这个东西,我自己都不会用,只能用来证明我会堆代码而已。
做你M的比,你的代码就是javascript界的垃圾!
@tulayang 对不起,没有老师教我,我只能自己学。你自己再仔细想想闭包要不要分配内存?没有内存状态数据状态怎么保持的?跟函数的关联怎么做的?malloc只是内存分配的一个比喻,你总不敢说闭包不需要内存的分配。
至于static的用法,我知道的只有三个,修饰函数外变量函数内变量,这两种都是编译器分配在静态区的,生命周期与程序运行周期相同,还有一种修饰函数,表示函数只在本文件内使用。其他的你可以补充。
所以我说你不懂闭包,你就老实的承认,装你M的比。 别再提static, malloc,丢人。
@tulayang 你懂的话,就把你懂的说出来。就如我的代码,你不喜欢,自然可以重写一个更好的。这里大家都在讨论,只要不骂脏话。你知道你满嘴脏话我为什么不骂回去么?你满嘴脏话骂不到别人,骂的都是自己的父母,我没有资格,也没有义务替你的父母来教育你,抱歉。
禁言了 @tulayang
@alsotang 千万不要啊,由他带起的讨论让大家也可以多学点知识,我也是受益者,希望给他个机会,继续发挥自己的作用,只要不骂人就行了。当然他要骂也没办法,给他骂就是了,骂不死不是。
他说我那代码垃圾,说得一点也不错,那个代码是我费了好大劲写出来的,写完一看,自己也不满意,仅仅为了实现功能。不过异步目录和文件遍历本身的确比较难,我倒是想看看其他人是怎么实现了,反正对自己的很不满意。
闭包跟 static 完全两个概念。。。。。。。。。。。。。。。。。。 闭包跟 malloc 也很少扯上联系。。。。。。。。。。。。。。。。。
@coordcn 装B,目标就是让你觉得他很懂。你还向这个水货请教,那他目标就达到了。我都不回复他了,他还要跑过来 at 我,可见他装X的瘾还远没满足呢。在我眼里他就像在光屁股裸奔,他就仗着你们看不出来他是个水货,他才敢痛痛快快地裸奔
@alsotang 我是说的内部实现,闭包如果不分配内存状态记录在哪里?
至于说static,我认为还是可以对比下的。
function test(){
var i = 0;
return function(a){
i = a + i;
return i;
}
}
var c = test()(3);
int test(int a){
static int i;
i += a;
return i;
}
这两者不是很类似么?i作为一个闭包,自己要存储状态,肯定需要内存,还要跟返回的函数关联,这肯定也要内存,所以我认为我提到内存并没有什么不妥。说白了他们都是解决变量的作用域与生命周期的问题。
@JexCheng 我当然知道他是什么心态,但是公平的说,这些讨论还真都由他引起的,他的水平怎么样且不说,但他能让大家热烈的讨论,本身就是好事情,就像那个事件编程,我本来也没好好想过他的问题在哪里,只是觉得那种代码是脱裤子放屁(函数调用就能解决),经过你提醒知道,才意识他自己把事件给绑了。至于他骂人,那是个人教养问题,当没看见就是了。
@coordcn 用不着这么去理解,我经常说的是,理解语言机制,不要从其实现上去理解。比如大部分人都搞不清什么叫按引用传值,别多想,什么“传地址”的说法都是错的,他们的错误就是,没有分清语言设计和具体实现。明白这点就行,不要走上歧路。(我会说闭包不一定需要为你说的“存储状态”分配内存么?因为闭包不一定不是纯函数啊?)
PS:static变量始终只有一个,并且是永生的。闭包变量当然不是这样。
@coordcn 我怎么不觉得是他让大家热烈讨论。我是前几天为了问个Node.js问题刚注册的。真的不觉得。
@JexCheng 我用static作比是我自己的一种理解方式,c语言是有其本身局限性的,static是静态分配的,灵活性肯定不如闭包。
为了不必要的误解,我澄清一下,闭包是闭包,c的static的是static,两者其实是风马牛不相及的东西,他们要说一样,顶多是作用上的类似,都是实现了一定作用域内变量访问。闭包是动态分配的内存,static是由编译器静态分配的内存。
对那个喷子有任何幻想的,我是说对他的技术水平有幻想的,请看:https://cnodejs.org/topic/552f49cee6ca0c7d05ebb217 到最后,他自己不好意思就把so beautiful的一个帖子自己删了(本坛子被删的帖子仍可根据网址访问)。另外那个柯里化的帖子,还有其它,他觉得被戳穿就自删了,可以避免认错。
本来他以为"不借助框架[3]"为他保住面子呢,所以但留此贴不删,结果发现自己的代码实在不能见光,无奈删去也。
@LongHorn-C 你错了,你还是低估了他的阿Q精神,虽然别人看起来他是在装X,但他却是自以为自己真牛X,要是一个人稍有那么一点点自知之明的话怎么也不会喷得这么毁三观的(前面他还又自告奋勇地帖了一个错误的EventEmitter实现,真是无语,我看他就像在看一个原始人光着屁股在你面前跳来跳去一样,你感受一下)。你看他博客:http://www.jianshu.com/p/5131952a39b4 。那些低级代码都留着呢。他删帖绝不可能是因为他意识到自己错了没脸了。
哎,这货@tulayang 到处喷,整天粗话连篇,禁言算了
@LongHorn-C 牛,你一定要找出来,否则会被口水淹死的
看完你们说的,我吓得都快不敢回复了。。
突然想起一段话
如果用圆内的面积代表我们学到的知识,圆外的空白就是我们的无知面。 圆越大,其圆周接触的无知面就越多。 接触的无知面越多,就会越发觉得自己懂的东西很少。
人越无知,就越狂妄
曾经看到有人写了类似这样的代码。
for(var i=0;i<10000;i++){
if(i%7==0){
print(i);
}
}
我回复,可以把i++改为i=i+7; 就不用去判断i%7==0了。 没想到楼主对我破口大骂,说我脑子轴了,叫我别秀我那可怜的代码。 虽然开口闭口用的都是【您】,但是实在觉得讽刺。
好几天没来了,随便进个主题,还在吵,哈哈哈
都是我的错,不该提起
代码是用来美化世界的,为人类服务的,如果因此剑拔弩张,xxxx 就有违它存在的初衷了。
泡过若干个技术社区、坛子。从没见过@tulayang这种人。世界之大,无奇不有。
@coordcn 存在堆栈中
@NexusLee 到底是堆(heap)还是在栈(stack)呢?
@coordcn 只是猜测而已 :)
@fanghongjia 这种人也是让我长了见识 想想自己还是未入职的学生 工作中如果碰到这种领导我可能会自杀
这什么情况,以前一直注册不了,现在注册了,这是什么情况。。。。
吓死宝宝了 这个帖子
@alsotang 社区上面的搜索能调整下吗?被墙了,跳不过去啊!
纯讨论技术。
闭包在实现上的确是需要独立申请内存,堆栈是不足以实现闭包的。 原因是闭包需要在函数作用域结束后仍然有效,此时堆栈已经释放,保存在堆栈上的数据也就不会存在了,因此必须为一个闭包申请一块内存来保存数据。 感兴趣的同学可以用 chrome 的 profiler 抓一个内存快照来看,会看到很多命名为 closure 的对象存在,那个东西就是为了让闭包在离开作用域仍可以访问而申请的独立内存块。
感谢响马大哥对闭包实现做了详细的解释,有志前后端通吃的,这些稍微底层的知识还是要知道的。