可能重复:
“var FOO = FOO || {}”在 Javascript 中是什么意思?
Javascript - 你可以在变量声明中添加条件吗
我相信这与范围界定有关,而不是重新定义范围。我在流行的 javascript 框架中看到了很多这样的内容:
var something = something || {};
这与不意外地重新定义顶级变量有关吗?
可能重复:
“var FOO = FOO || {}”在 Javascript 中是什么意思?
Javascript - 你可以在变量声明中添加条件吗
我相信这与范围界定有关,而不是重新定义范围。我在流行的 javascript 框架中看到了很多这样的内容:
var something = something || {};
这与不意外地重新定义顶级变量有关吗?
你是对的。如果变量已经存在(我们的或不存在的),请不要更改它。如果它不存在,让我们创建一个新的。
var something = something || {};
可以在带有未设置参数的函数内部使用
function doStuff( arg1, arg2, arg3 ) {
arg2 = arg2 || {};
arg3 = arg3 || arg1 + 2;
};
当您调用函数 doStuff 时,这使得第二个和第三个参数是可选的
这将创建一个具有本地范围的新对象。如果外部something
为空、假或未定义(或其他错误),则新变量将为空对象{}
。
您没有重新定义范围,您只是确保变量存在于现有范围内。赋值语句可以读作:
“如果something
存在(而不是undefined
,,或null
,设置(即,什么都不做)。如果它不存在,则创建它并将其设置为等于空对象文字”0
false
something = something
这个结构对于不覆盖现有数据非常有用。假设我们正在处理多个 Javascript 文件,并且我们希望在某个对象上共享一些数据。
一个.js
var share = window.share = share || { };
share.thisIsA = true;
b.js
var share = window.share = share || { };
share.thisIsB = true;
如果我们有两个以上的文件并且我们异步加载这些文件(我们不能保证顺序),我们不会覆盖share
之前定义和填充的全局对象。这是命名空间对象或配置对象的一种非常常见的做法。
另一个非常常见的用例是创建默认值。例如
function foo( option ) {
option = option || 'something';
if( option === 'foobar' ) {} // ...
}
在那里,如果函数在没有参数的情况下被调用,我们使用该模式为我们的选项参数提供至少一个已知和定义的值。例如,您可以在插件代码中经常看到这一点。
这和这样做是一样的:
var something = ( something ) ? something : {};
( something )
对真值或假值的评估在哪里。如果truthy(something
存在),它将等于自身,否则为空对象。
看起来更像是在确保某物是可以挂在上面的物体。设置默认值。
一旦你调用 var something 或将其设置为函数的参数,该范围内的所有实例都是新变量,你无法访问更高范围内的实例。
(function() {
var something = 'foo';
(function() {
var something = something || 'bar';
console.log(something);
})();
console.log(something);
})();
将输出
'bar'
'foo'
javascript中的OR构造函数接近这个函数
function or(a, b)
{
if(a) return a;
else return b;
}
当“a”评估为真时,它甚至不检查“b”(也不执行它,但它不是函数案例)。此外,它返回纯“a”而不将其更改为 boolean。非布尔变量“ORed”的构造计算为第一个变为布尔值 true。它广泛用于无法支持某些东西的地方。
var functionDoingSomethingCrossBrowser = functionOnMsie
|| functionEverywhereElse;
{}
当您的“某物”在范围内不可用时(很可能未定义,其评估结果为假),这与(新对象)运算符相结合用空对象填充变量。