我目前正在学习开发javascript / jquery插件,并且我注意到其中许多插件具有以下语法:
var pluginName = window.pluginName || {};
我很难理解这意味着什么,特别是OR花括号部分。如果有人可以在代码的上下文中阐明这意味着什么,那就太棒了。
答案 0 :(得分:6)
转换为:
sandwichMaker("ham")("swiss");
了解更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators
答案 1 :(得分:5)
如果window.pluginName
为null
或undefined
(或其他 falsy ,如false
或0
,则意图是通常要检查undefined
),变量pluginName
将设置为指向空对象。
此行依赖于short circuit的OR:如果第一个操作数是 falsy 值(false,或null
或undefined
),则结果表达式将是第二个操作数:{}
这是一个空对象。
这个想法是将变量初始化为某个(可能是空的)对象。
在javascript 模块模式中使用了另一个带有空对象的短路实例。 Here's关于模块模式的一个很好的教程,但特别是,请参阅松散增强部分。以下是该部分的示例模块定义:
var MODULE = (function (my) {
// add capabilities...
return my;
}(MODULE || {}));
在该示例中,代码将通过调用立即调用的函数表达式在全局命名空间中定义新模块(具有属性/函数集合的对象):第一次执行定义模块的函数,它将被传递一个空对象, capabilities (属性,函数)将被添加到其中。
答案 2 :(得分:0)
这是确保将变量初始化为对象的一种方法,通常使对象可以添加数据和/或方法。如果框架将方法定义拆分为不同的文件,通常会使用它,因此在设置库时,文件加载没有顺序依赖。
在这种情况下,'plugin'将被分配插件的当前值,或者如果它还没有空对象。
答案 3 :(得分:0)
这是ekuusela在其他答案中发布的代码的一种常用简写:
var pluginName;
if (window.pluginName) {
pluginName = window.pluginName;
} else {
pluginName = {};
}
但是:我想补充一点,这在某些用例中是不好的做法,它会导致细微的错误(虽然这个特殊的例子很好)。原因是||
之前的第一个陈述是假的,所以所有的虚假陈述都会导致第二个被执行的陈述,这并不总是你想要的。
示例:许多人使用此构造来测试参数是否已分配值,如果未指定默认值。例如:
function repeat(text, nrOfRepeats) {
text = text || '';
nrOfRepeats = nrOfRepeats || 1;
var i = 0, result = '';
for (i = 0 ; i < nrOfRepeats; i++) {
result += text;
}
return result;
}
如果你这样称呼这个函数:repeat('hello', 0)
,你就会期望得到一个空字符串,但是你会回来“问候”。这是因为0参数是假的,nrOfRepeats = nrOfRepeats || 1
将解析为1而不是你给出的0。
使用此构造时要小心。确保||
之前的第一个陈述在你不想要的时候永远不会是假的。这些值被认为是假的:0,false,undefined,null,NaN,&#39;&#39;。