我有以下来自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
是未定义的就足够了?
我说得对吗?
这基本上是正确的
它只是想这么做。
jQuery._data(this, "events")[event.type] || []
但是,如果jQuery._data(this, "events")
为false(未定义),他们会先将其设置为{}
,这样[event.type]
对象属性访问器就不会引发拟合。
另一种写法可能是
handlers = (function(context){
var events = jQuery._data(context, "events") || {};
return events[event.type] || [];
})(this);
所以这意味着对于要返回的数组来说,
event.type
就是undefined
就足够了?
是,但如果event.type
的值不作为对象中的属性名称存在,则也会返回数组。也就是说,如果第一个表达式的计算结果为空对象,则event.type
的任何值都将导致返回数组。
示例:
({}['click'] || [])
-
如果没有附加事件
jQuery._data( this, "events" ) === undefined
,则返回空对象
几乎,如果_data
调用返回null、0或false…基本上是任何错误值,逻辑||
(OR)也会将给定表达式(jQuery._data(this, 'events') || {})
)求值为空对象文字
- "因此,这意味着要返回数组,event.type未定义就足够了"
是的,无论是在jQuery._data(this, 'events')
的返回值中还是在emtpy对象文字中(在这种情况下,它几乎肯定是未定义的),它都将计算为一个空数组,这就是handlers
将被分配的。
如果你疯了,出于某种原因在Object原型上设置了一个属性:
Object.prototype.click = 'I was set by a madman';
您的代码永远不会为click
事件类型返回空数组,因为无论是在实例上还是在原型链的更高层,都会发现属性click
。这就是为什么你永远不应该接触原生原型,除了一些罕见的情况。即便如此,也不要在Object.prototype
上设置非函数属性