为了账号安全,请及时绑定邮箱和手机立即绑定

请问如何理解var handles = this._handles中的_handles

请问如何理解var handles = this._handles中的_handles

蝴蝶刀刀 2018-09-13 14:09:01
麻烦问一下,我在学习组件,有一段代码看不太懂,定义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;


查看完整回答
反对 回复 2018-10-12
  • 1 回答
  • 0 关注
  • 711 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信