3

可能重复:
“var FOO = FOO || {}”在 Javascript 中是什么意思?
Javascript - 你可以在变量声明中添加条件吗

我相信这与范围界定有关,而不是重新定义范围。我在流行的 javascript 框架中看到了很多这样的内容:

var something = something || {};

这与不意外地重新定义顶级变量有关吗?

4

8 回答 8

5

你是对的。如果变量已经存在(我们的或不存在的),请不要更改它。如果它不存在,让我们创建一个新的。

于 2012-08-27T17:03:04.293 回答
3

var something = something || {};

可以在带有未设置参数的函数内部使用

    function doStuff( arg1, arg2, arg3 ) {
        arg2 = arg2 || {};
        arg3 = arg3 || arg1 + 2;
    };

当您调用函数 doStuff 时,这使得第二个和第三个参数是可选的

于 2012-08-27T17:06:57.053 回答
2

这将创建一个具有本地范围的新对象。如果外部something为空、假或未定义(或其他错误),则新变量将为空对象{}

于 2012-08-27T17:03:54.023 回答
2

您没有重新定义范围,您只是确保变量存在于现有范围内。赋值语句可以读作:

“如果something存在(而不是undefined,,或null,设置(即,什么都不做)。如果它不存在,则创建它并将其设置为等于空对象文字”0falsesomething = something

于 2012-08-27T17:04:56.130 回答
2

这个结构对于不覆盖现有数据非常有用。假设我们正在处理多个 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' ) {} // ...
}

在那里,如果函数在没有参数的情况下被调用,我们使用该模式为我们的选项参数提供至少一个已知和定义的值。例如,您可以在插件代码中经常看到这一点。

于 2012-08-27T17:06:38.927 回答
2

这和这样做是一样的:

var something = ( something ) ? something : {};

( something )对真值或假值的评估在哪里。如果truthy(something存在),它将等于自身,否则为空对象。

于 2012-08-27T17:07:14.807 回答
0

看起来更像是在确保某物是可以挂在上面的物体。设置默认值。

一旦你调用 var something 或将其设置为函数的参数,该范围内的所有实例都是新变量,你无法访问更高范围内的实例。

(function() {
  var something = 'foo';

  (function() {
    var something = something || 'bar';

    console.log(something);
  })();

  console.log(something);
})();

将输出

'bar'
'foo'
于 2012-08-27T17:09:11.883 回答
0

javascript中的OR构造函数接近这个函数

function or(a, b)
{
  if(a) return a;
  else return b;
}

当“a”评估为真时,它甚至不检查“b”(也不执行它,但它不是函数案例)。此外,它返回纯“a”而不将其更改为 boolean。非布尔变量“ORed”的构造计算为第一个变为布尔值 true。它广泛用于无法支持某些东西的地方。

var functionDoingSomethingCrossBrowser = functionOnMsie 
                                      || functionEverywhereElse;

{}当您的“某物”在范围内不可用时(很可能未定义,其评估结果为假),这与(新对象)运算符相结合用空对象填充变量。

于 2012-08-27T17:12:38.117 回答