我滴天!我曾经写过 21 个嵌套的回调

大约21个月之前,那时候我还不知道什么是回调(callback),我建立了我的第一个网页。为了纪念这21个嵌套的回调,我觉得现在是回顾这个网页的时候了。

在那时我有个可能有点老套的习惯,就是在人文课程或者家庭旅游的时候在笔记本上信手涂鸦一番。在某次暑期旅行中我创作了一组我自己觉得超酷的三角形图案。于是我觉得把它做成电子版是在那个夏天值得下功夫的事情。我还憧憬着这套东西让我在Tumblr上的形象显得超酷无比。

我开始找了些计算机专业的朋友们,问他们是否可以给我指点一下方向。我得到的大把的答复可以总结为“google一下”,潜台词就是:“如果你google完了还不知道咋弄,你就是低能儿。”


“我想在我的网页上做个三角形…不过Google看起来没给我什么好的答案。”

“不,你要用‘CSS triangle’ 作为关键字去Google。看见了没?这很简单。”

“不好意思…CSS和三角形有什么关系?”

对话记录通常到此嘎然而止,或者是到“CSS就是你用来修饰你的HTML的东西。”

(从这些交流过程中我总结出一个结论:程序猿们总是在比着看谁能把最多的事情称为“简单的”)

每次对话完之后,我都觉得自己真是极品的废物。不过我后来发现了如何用一个div(那玩意代表啥东西?)和几行CSS来做出一个三角形形状,还有一些具有很酷的变换颜色效果的网站,可以复制下来做我的三角形图案。

I我知道你现在肯定很好奇我(这么一个编程小白)是怎么拼凑出这些来的。

好吧,这里就是我的HTML的概貌:

<div id="row1">
  <div class="btri"></div>
  <div class="tri"></div>
  <div class="tri"></div>
  <div class="tri"></div>
  <div class="emp"></div>
  <div class="tri"></div>
  <div class="tri"></div>
</div>
<div id="row2">
  <div class="tri"></div>
  <div class="tri"></div>
  <div class="tri"></div>
  <div class="tri"></div>
  <div class="tri"></div>

我要悲哀地告诉你们,下面还有165行类似的东西,另外配套的JavaScript代码也是一样重叠起来的,它就是个平行四边形。

我后来又知道了有一种叫jQuery的东西,我可以用它的“API”里某个叫“animate”的东西来逐步改变我的三角形的各种属性。我发现如果 我调用一次$(‘#something’).animate({ ‘opacity’: ‘0’ })就会让一个三角形消失。在我的头脑中觉得,如果我想让我的20行三角形一个个地消失,我需要把这样的代码写上20遍,这是符合逻辑的。

通过拷贝和粘贴内容到JavaScript文件里的起始位置的方式,我还“ imported | 导入”了jQuery。我曾经在其他的网页上看见它在不同的文件里,但我决定不管是否合理,也要把我所有的JavaScript都放到一个文件里。

如果我打算自欺欺人,我可以说我选择了最优化的编程方式:用最难的风格。

$(".disappear").click(function(){
  $("#row20").animate({ "opacity": "0" },
    100,
    function(){$("#row19").animate({ "opacity": "0" },
      100,
      function(){$("#row18").animate({ "opacity": "0" },
        100,
        function(){$("#row17").animate({ "opacity": "0" },
          100,
          function(){$("#row16").animate({ "opacity": "0" },
            100,
            function(){$("#row15").animate({ "opacity": "0" },
              100,
              function(){$("#row14").animate({ "opacity": "0" },
                100,
                function(){$("#row13").animate({ "opacity": "0" },
                  100,
                  function(){$("#row12").animate({ "opacity": "0" },
                    100,
                    function(){$("#row11").animate({ "opacity": "0" },
                      100,
                      function(){$("#row10").animate({ "opacity": "0" },
                        100,
                        function(){$("#row9").animate({ "opacity": "0" },
                          100,
                          function(){$("#row8").animate({ "opacity": "0" },
                            100,
                            function(){$("#row7").animate({ "opacity": "0" },
                              100,
                              function(){$("#row6").animate({ "opacity": "0" },
                                100,
                                function(){$("#row5").animate({ "opacity": "0" },
                                  100,
                                  function(){$("#row4").animate({ "opacity": "0" },
                                    100,
                                    function(){$("#row3").animate({ "opacity": "0" },
                                      100,
                                      function(){$("#row2").animate({ "opacity": "0" },
                                        100,
                                        function(){$("#row1").animate({ "opacity": "0" },
                                          100)})})})})})})})})})})})})})})})})}

你可以在这里看到完整的源代码和最终产品。

(我甚至经历了对齐每一个回调方法的缩进的麻烦,这在Windows Notepad上可是不容小觑的绝技)

注意以上JavaScript的结尾是一套壮观的 )})})})})})})})})})})})})})})})})})})})。 当看到那些三角形按我的意图消失又出现时,我真是太高兴了。代码本身就像壮观的ASCII瀑布,或者是高级西班牙语课本里常见的印加文化的灌溉系统。这些 代码是有效的,我在Google上也没看到谁说这些代码错的一塌糊涂,或者说任何看到我代码的程序员都会永远禁止我和我的子孙接近互联网。

等到有个真正的软件工程师来看我的三角形代码的时候,我已经看过足够多有关SICP(计算机程序的构造和解释)材料并意识到我的代码既恐怖又可怕。“不过,初学者总是会犯这样的错误,对吧?”我窘迫地试探着问道。

“不,程序猿是不会干这种事的。”他倒不是挖苦的口气。我当时就想把话题引到分子和细胞生物学上去。不过他随后又补充说:“没有哪个程序猿会写出这样的代码,因为他们根本就没有那个耐心。”

不管他的第二段话是不是肺腑之言,我对整个事情的感觉好了一些。

不管怎样,后来我还是羞愧地把我的三角形刨坑埋了。随着时间一天天一月月地过去,它们最终成为愚昧的起步之旅。“嗨,你这俩钟头都花在调试你的 CoffeeScript代码里的空白字符问题了?想当年我花了一天时间来写21个嵌套的回调和200行相同的HTML。”这个故事通常会产生一种自我调 侃的搞笑效果。

我认识到,自三角形项目以来,我写的每一行代码都只会让我在“google一下”、调试代码,和五花八门的编程主题等方面更强,而这都是因为我亲身去经历了每一个看似愚蠢的项目。

上个星期我花了点时间快速重写了我的三角形。你可以在这里看到它,在响应性和动态生成效果上令人自豪,这些是我在当年毫无概念的(当然了,我也只能牺牲了老版本里明显的优点)。我保持了最初的设计精髓,即用div生成三角形,用jQuery来做动画效果。

既然我快要离开安全、绿树环抱的伯克利的围墙,进入真实的世界(也希望使我过去对代码的犯罪记录安息),我希望给初出茅庐的发明家和害羞的创作者,留下我的三角形中一到三个角作为遗产。

编程很难。绝不要因为你不如你旁边的人善于“去Google一下”就心情沮丧。绝不要让那些言必称黑客马拉松的 假行家忽悠你,让你放弃做出下一个猫咪的微博或者公共厕所点评网的机会。就算是最蠢的点子(例如尝试做多边形消失和重现的动画)都会帮助你作为一个程序猿 不断提高。学习编程很大程度上是学会如何学习,而最好的学习方法就是去动手做。

归根结底,成为一个称职的程序猿和你赢了多少次黑客马拉松或者你能想出多少新奇的点子无关,而是和执行力、关注细节、全心投入、对于创造和突破的热情有关。

如果你在对你的代码感到羞愧,我允许你嘲笑一次我那三角形项目里的21个嵌套回调。

====================================分割线================================
文章转载自 开源中国社区[http://www.oschina.net]

时间: 2024-09-30 03:41:44

我滴天!我曾经写过 21 个嵌套的回调的相关文章

【BeanUtils】自己写的BeanUtils的嵌套使用

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] 其实不打算写的,因为和前面的是一样的,不过既然有人问起,我就写一下吧. MyBeanUtils 这是核心的类: 通过这个类来返回一个bean对象的. 你给的参数是bean的class和封装的Map对象. package cn.hncu.beanUtils; import java.lang.reflect.Field; import java.lang.reflect.Invoca

Promise &amp; Generator——幸福地用同步方法写异步JavaScript

最近在写一个自己的网站的时候(可以观摩一下~Colors),在无意识中用callback写了一段嵌套了5重回调函数的可怕的代码.回过神来的时候被自己吓了一跳,这可不行啊,丑得没法看啊!于是打算尝试一下一些流行的异步的解决方案.经过一番折腾之后...我终于找到了一个令自己满意的方案了(爱不释手).不过在正式介绍它之前先扯一些其他的相关知识先吧! 1. JavaScript异步解决方案有哪一些 其实异步JavaScript已经不是什么高级的东西了,Nodejs的出现,特别是callback hell

HTML5 离线存储之Web SQL

本篇没有考虑异步,多线程及SQL注入 WebDatabase 规范中说这份规范不再维护了,原因是同质化(几乎实现者都选择了Sqlite),且不说这些,单看在HTML5中如何实现离线数据的CRUD,最基本的用法(入门级别) 1,打开数据库 2,创建表 3,新增数据 4,更新数据 5,读取数据 6,删除数据 事实上,关键点在于如何拿到一个可执行SQL语句的上下文,像创建表,删除表,CRUD操作等仅区别于SQL语句的写法.OK,貌似 "SqlHelper"啊,换个名字,dataBaseOpe

我经历的IT公司面试及离职感受(转)

毕业后几年一直待在广州,觉得这是一个比较生活化及务实的城市,其互联网公司和相应的投融资环境都不如北深上活跃,大大小小的面试也有几十个,有点规模的公司应该都面试过了,面试一般会见到主力技术人员,技术主管,技术总监,人力几个人,狭义上还是可以看出一些公司文化技术氛围滴,于是想写这样一篇文章,介绍经历也给予朋友们看看. 先介绍下自己的技术背景,二流大学计科毕业,GPA3.21/4.0,计算机专业课都有 90 分以上,高数基础不太好,也是我目前的瓶颈,程序语言基础不算差,外企,国企,民企都混过,做了 6

深入理解JavaScript编程中的同步与异步机制

  这篇文章主要介绍了深入理解JavaScript编程中的同步与异步机制,不仅仅是AJAX已经深入到了各个角落,Node.js的火爆也让JS的异步编程格外引人注目,需要的朋友可以参考下 JavaScript的优势之一是其如何处理异步代码.异步代码会被放入一个事件队列,等到所有其他代码执行后才进行,而不会阻塞线程.然而,对于初学者来说,书写异步代码可能会比较困难.而在这篇文章里,我将会消除你可能会有的任何困惑. 理解异步代码 JavaScript最基础的异步函数是setTimeout和setInt

C#陷阱:int i = 10; i += i++; i = ?

参加某公司的笔试时的一道题目:int i = 10; i += i++; i = ?.当时我写了21.但当我在C#中写了如下代码测试时 static void Main(string[] args) { int i = 10; i += i++; Console.WriteLine(i); Console.Read(); } 编译器告诉我,结果是20.为什么!我错了吗?我开始纳闷了.我赶紧用VC(Visual Studio.net2003)重新编了一段测试代码,如下: int _tmain(){

微信公众平台开发问答-20161215

================================================================ 消息分组:QQ群 518924126================================================================消息对象:微信平台开发有问必答群================================================================ 2016-11-16 18:15:33 [师

软件工程师的职业之路

原文:http://blog.csdn.net/ladofwind/article/details/19103915 记得看过某篇文章写到21世纪世界范围内最好的前十大职业有软件工程师一项,平心而论,应该说缺少的是良好职业素养的,有经验的,合格的软件工程师. 从国内招聘网站上的数据也能看出来,近些年由于移动互联网,互联网的蓬勃发展,以及因为互联网对传统行业的整合一系列影响,软件工程师需求一直很旺盛,另一方面,高校的计算机专业培养出的人与企业需要的人有差距,所以知名大学的硕士博士首先有更多的机会进

《 C++程序设计:原理与实践(进阶篇.》导读

本节书摘来自华章出版社< C++程序设计:原理与实践(进阶篇)>一书中作者[美] 本贾尼·斯特劳斯特鲁普(Bjarne Stroustrup) 著 刘晓光 李忠伟 王刚 译     前 言 Programming: Principles and Practice Using C++, Second Edition 该死的鱼雷!全速前进. --Admiral Farragut 程序设计是这样一门艺术,它将问题求解方案描述成计算机可以执行的形式.程序设计中很多工作都花费在寻找求解方案以及对其求精上