9

我在一本书中找到了这个例子:

// Create _callbacks object, unless it already exists
var calls = this._callbacks || (this._callbacks = {});

我简化了它,这样我就不必使用特殊的对象范围:

var a = b || (b = "Hello!");

当 b 被定义时,它就起作用了。当 b 未定义时,它不起作用并抛出 ReferenceError。

ReferenceError: b is not defined

我做错什么了吗?谢谢!

4

2 回答 2

11

当执行类似的属性查找时this._callback,如果该_callbacks属性不存在,this您将得到undefined. 但是,如果您只是对像 之类的裸名称进行查找,如果不存在b,您将收到一个引用错误。b

这里的一种选择是使用带运算符的三元组,如果操作数是尚未定义的变量,typeof它将返回。"undefined"例如:

var a = typeof b !== "undefined" ? b : (b = "Hello!");
于 2013-11-08T18:30:47.650 回答
4

它应该以这种形式工作:

var b, a = b || (b = "Hello!", b);
//  ^ assign b
//                           ^ () and , for continuation
//                             ^ return the new value of b
//=>  result: a === b = "Hello!"
于 2013-11-08T18:30:40.193 回答