麻烦问一下,我在学习组件,有一段代码看不太懂,定义handles用var handles没问题,但是突然多出来的_handles该怎么理解?按照自己之前的固有印象_handles是私有变量,但是明显之前没有定义,为什么可以这么用呢。谢谢各位大神!var emitter = {// 注册事件on: function(event, fn) {var handles = this._handles || (this._handles = {}),
calls = handles[event] || (handles[event] = []);// 找到对应名字的栈(据说是列表)calls.push(fn);return this;
},
1 回答

潇湘沐
TA贡献1816条经验 获得超6个赞
先解释一些代码的意思
var handles = this._handles || (this._handles = {})
这里on方法没有主动用其他对象去掉用(call,apply)的话,this代表emitter,this._handles表示在this/emitter中找_handles属性。与声明变量和赋值,如”var a = a || 1;“不同,取对象中的属性不是变量不需要先声明定义。
在js中,this._handles || (this._handles = {})表示this._handles运算值为false(false, 0, null, undefined)时执行(this._handles = {})。
从逻辑语义上看,当this下_handles属性没有初始化或赋有效值的时候就用{}初始化。
至于是否是私有变量看你怎么用,“_”开头表示私有变量的方式只是一种约定,有很多方式实现私有变量(闭包等)。
附(全局window):
a = 1; // 这个赋值(相当于window.a = 1,这是规范里处理全局变量对象[VO]的方式)而a = a || 1; //报错 这里等号后面的a是未定义的(这里先执行等号后面的,恩,a此时确实未定义),而a = window.a || 1; //正确
不要问为什么 规范就这么定义的 a = a || 1; 不相当于 a = window.a || 1;
添加回答
举报
0/150
提交
取消