0

我从 jQuery 本机代码中获取了以下表达式:

handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || []

我很好奇在什么条件下表达式的最后一部分 - []- 将被分配给handlers变量?以下是我的推测:

1)这部分首先执行( jQuery._data( this, "events" ) || {} )。如果没有附加事件jQuery._data( this, "events" ) === undefined,则返回空对象。

2)然后{}[event.type] || []处理这部分。如果event.type未定义,则返回一个数组并将其分配给handlers变量。所以这意味着对于要返回的数组来说,event.type未定义就足够了吗?

我对吗?

4

3 回答 3

2

这基本上是对的

它只是试图做到这一点。

jQuery._data(this, "events")[event.type] || []

但是,如果jQuery._data(this, "events")是假的(未定义),他们会将其设置为{}第一个,这样[event.type]对象属性访问器就不会出错。


另一种写法可能是

handlers = (function(context){
  var events = jQuery._data(context, "events") || {};
  return events[event.type] || [];    
})(this);
于 2013-08-26T08:03:08.073 回答
1

所以这意味着要返回的数组就足够event.typeundefined

event.type是的,但是如果对象中的属性名称不存在的值,也会返回该数组。也就是说,如果第一个表达式的计算结果为空对象,则 的任何值都event.type将导致返回数组。

例子:

({}['click'] || [])
于 2013-08-26T08:02:02.400 回答
1
  • “如果没有附加事件jQuery._data( this, "events" ) === undefined,则返回空对象。”

几乎,如果调用返回 null、0 或 false ,逻辑||(OR) 也会将给定的表达式 ( 评估为jQuery._data(this, 'events') || {})空对象字面量......基本上是任何虚假值。_data

  • “所以这意味着对于要返回的数组,event.type 未定义就足够了”

是的,无论是在返回值中jQuery._data(this, 'events')还是在 emtpy 对象文字中未定义(在这种情况下,它几乎肯定是未定义的),这将评估为一个空数组,这就是handlers将被分配的内容。

如果您非常疯狂,并出于某种原因在 Object 原型上设置了一个属性:

Object.prototype.click = 'I was set by a madman';

您的代码将永远不会click为事件类型返回一个空数组,因为click始终可以找到该属性,无论是在实例上,还是在原型链的更上方这就是为什么你永远不应该接触原生原型,除了一些罕见的情况。即使那样,也不要Object.prototype

于 2013-08-26T08:04:12.300 回答