JavaScript 关于 backbone 的源码

ane · 2013年11月15日 · 最后由 u1378130755 回复于 2013年11月18日 · 2940 次阅读

最近学学 backbone 吧,看源码看到了类似于这样的写法

var events = this._events[name] || (this._events[name] = []);

内心惶恐了,这个语法方式从来没用过,我突然发现自己似乎不懂 js 的语法啊,虽然平时也用 jquery 写一些,但从没遇到这样的写法。 求大神们指点一下,我该从哪里补习?

backbone 依赖 underscore,要先看看 underscore

#1 楼 @Teddy 哦,那这个算是 underscore 的语法了?

你能贴一下前后代码么?或者贴一下这行代码在 github 上得行号也行啊,Backbone 代码很少,也很容易阅读理解,我们可以一起来讨论一下。

#3 楼 @lgn21st 哇,吕哥出来了,我知道你有研究过,哈哈。找到救命大船了。这个就是 backbone 源码里的一句,我主要是不熟悉这样的写法(虽然知道它的意思,但是要我自己在代码里写,就不敢写了). 我贴的稍微全点

var Events = Backbone.Events = {

   // Bind an event to a `callback` function. Passing `"all"` will bind
   // the callback to all events fired.
   on: function(name, callback, context) {
     if (!eventsApi(this, 'on', name, [callback, context]) || !callback) return this;
     this._events || (this._events = {});
     var events = this._events[name] || (this._events[name] = []);
     events.push({callback: callback, context: context, ctx: context || this});
     return this;
   },

#3 楼 @lgn21st 我是因为 “teahour 听到你用两天读了源码” 这样的励志故事,所以,我也就试着读一读,才发现,有很多地方连语法都没见过

这行代码其实不难理解,this._events 是一个全局变量,用名字去存储所有的注册的 event 的 callback。

比如给某个用户 event 比如 click 绑定了三个 callback, 那么这三个 callback 就以数组的形式保存,于是

this._events['click'] = [callback1, callback2, callback3];
events = this._events['click']
events #=> [callback1, callback2, callback3]

上面你贴出来的代码都是初始化代码,确保 this._events 是一个对象,本地变量 events 是一个数组。

#5 楼 @u1378130755 真得啊,我居然还说过这种事情..... 不过我用过的 javascript 框架和库,我基本上都会通读代码,有一定深度理解才能用好。( angularjs 除外,读起来有点 hold 不住 )

#6 楼 @lgn21st 你误会我意思了,我不是看不懂这段代码,我只是不熟悉这种类似于

var events = this._events[name] || (this._events[name] = []);

的写法,觉得赋值语句还弄个 ||,是 js 本身的语法吗?

#5 楼 @u1378130755 呜 短路法则嘛 这个应该很常用啊~ 还是之前说的哈 楼主不要让 java 限制了自己的思维

#8 楼 @u1378130755 你熟悉 Ruby 的这种语法么?@a = @a ||= 'foobar'

11 楼 已删除

#9 楼 @zj0713001 是的,很收限制,虽然一看,明白这就是短路,可要自己写,就不会,甚至不敢这样写

#10 楼 @lgn21st 虽然 ruby 语法也看了点了,不过这个写法,确实也没见过

#13 楼 @u1378130755 写多了,这种风格的代码由自己手写出来就很自然的事情了,光看是没有用的,每个自己学到的小知识,都配合一段代码去验证一下,你就真的掌握了。

image : first.isImage && first.image,

我写过这种,达到目的了,但不知道这样做好吗。。。

我重构的时候想到的,嘿嘿

#15 楼 @yfractal 嘿嘿 你这个写法可以用 first.try(:image) 如果是 rails 环境的话~ 结果都是一样的

#12 楼 @u1378130755 3 年前我做 java 外包的时候 就已经大量用短路啊 匿名内部类啊 动态生成类啊之类的比较 “危险” 的写法了 也许你现在的 java 项目太保守了吧 不管怎样希望楼主加油哈 早日转到 ruby 你会解脱并且豁然开朗的

#16 楼 @zj0713001 还真没这么用过!学习了!

#17 楼 @zj0713001 是呀,确实学到不少了,

需要 登录 后方可回复, 如果你还没有账号请 注册新账号