为什么在变量函数声明中使用 || ?

14

我正在学习js,遇到了一个例子,在声明函数变量时使用了||:

var Triangulation = Triangulation || (function() {   
...   

在我看来,这是在分配变量之前检查它是否已经声明。

浏览网络时,我没有看到其他使用此方法的示例。采用这种方法与采用何种方法相比,有什么理由呢?

var Triangulation = function() {   
...  

谢谢


4
可能是一种只需设置一次的方式? - Sico
请查看以下内容:https://dev59.com/jXI95IYBdhLWcg3w5iU4 - Nikhil N
var Triangulation = Triangulation || (function() { 这段代码的意思是,如果在执行到这一步之前已经声明了Triangulation变量,则跳过这一步。否则,继续执行函数内部的代码。 - Rajshekar Reddy
2
为什么这个问题会有这么多赞?我的意思是这个问题已经被问过很多次了。 - Derek 朕會功夫
非常感谢您的回答。我很欣赏对命名空间问题的见解。@Nikhil,这与您链接的线程(我已经阅读过)不同。这不是关于||的作用,而是为什么在这种情况下要使用它的问题。 - Mitch
5个回答

19
这意味着有可能已经定义了triangulation变量,如果已经定义,则triangulation变量返回自身;如果尚未定义,则匿名函数将返回新变量triangulation的值。

还有一件重要/敏感的事情就是var。这是一个棘手的问题。例如:

<script>
var triangulation = function (){return(1);};
</script>

实际上的意思是:

<script>
window.triangulation = function (){return(1);};// because "triangulation" is in global                       
                                               // namespace and "var" in this case 
                                               // means nothing "local", as you may expect
</script>

下次初始化var triangulation = ...覆盖全局变量。如果你想要保留它,你需要编写:

下次初始化var triangulation = ...覆盖全局变量。如果你想要保留它,你需要写:

var triangulation = triangulation || function (){...}; 

7
这个模式的常见用法是创建“命名空间”。例如,您可以定义:$ = $ || {}; $.app = $.app || {}; $.app.something = $.app.something || {};然后,您可以在每个文件的顶部包含相同的基本内容,以确保您的命名空间已定义且您的定义不会互相覆盖。 - John Kurlak

2
它检查是否存在Triangulation,然后使用短路求值为其分配新值。当您想要支持从浏览器到浏览器不同的功能时,这是一种常见的做法。
一个例子就是requestAnimationFrame。由于每个浏览器需要不同的供应商前缀,我们使用||将正确的方法分配给变量,以支持所有浏览器。
window.requestAnimFrame = (function(){
  return  window.requestAnimationFrame       ||
          window.webkitRequestAnimationFrame ||
          window.mozRequestAnimationFrame    ||
          function( callback ){
            window.setTimeout(callback, 1000 / 60);
          };
})();

//whatever exists will be assigned to window.requestAnimFrame .

2

对于 || 运算符,JS 返回第一个表达式的值,该值评估为 truthy 值
例如:
A||B(假设 A 是空字符串,B 是整数(12))
上述表达式将返回 12(即第一个评估为 truthy 值的表达式)。

在您的情况下,我们正在检查是否已声明 Triangulation,然后我们需要计算函数表达式并将其分配给 Triangulation。
var Triangulation = Triangulation || (function() {


1

这通常用于命名空间包,其实现被分割在多个文件中,当您不一定知道(或不想管理)文件加载顺序时。通常,您可以使用以下方式:

var Namespace = Namespace || {}

在您的情况下,这只是为了防止重新分配 Triangulation 类(如果已经定义)。

-1

在Javascript中,我们使用了几种运算符,例如&&(与)||(或)和!(非)运算符。

这些运算符也被称为逻辑运算符。

逻辑运算符主要用于控制程序流程。通常,您会将它们作为if、while或其他控制语句的一部分。

||运算符用于确定两个条件中是否有一个为真。

例如:

if (x==5 || y==5) { .... .... }

谢谢。


与问题无关。 - oligofren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接