Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么在变量函数声明中使用| |?_Javascript - Fatal编程技术网

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

Javascript 为什么在变量函数声明中使用| |?,javascript,Javascript,我正在学习js,我遇到了一个例子,其中在将var声明为函数时使用了| |: var Triangulation = Triangulation || (function() { ... 在我看来,这是在检查在赋值之前是否已经声明了var。 环顾网络,我没有看到任何其他使用这种方法的例子。采取这种方法的原因是什么 var Triangulation = function() { ... 感谢这意味着三角剖分变量可能已定义,如果已定义,则三角剖分变量将返回自身,如果尚未定义

我正在学习js,我遇到了一个例子,其中在将var声明为函数时使用了| |:

var Triangulation = Triangulation || (function() {   
...   
在我看来,这是在检查在赋值之前是否已经声明了var。 环顾网络,我没有看到任何其他使用这种方法的例子。采取这种方法的原因是什么

var Triangulation = function() {   
...  

感谢这意味着
三角剖分
变量可能已定义,如果已定义,则
三角剖分
变量将返回自身,如果尚未定义,则匿名函数将返回新变量
三角剖分
的值

重要/敏感的是
var
。这是一件棘手的事情。例如:

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

在使用指定新值之前,它会检查是否存在
三角剖分。当您希望支持不同浏览器的功能时,这是一种常见做法

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 .
一个例子是。由于每个浏览器都需要不同的供应商前缀,因此我们使用
|
为变量指定正确的方法,以便它支持所有浏览器

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 .

当您不一定知道(或不想管理)文件加载顺序时,这通常用于在多个文件之间拆分实现的命名空间包。通常,您可以通过以下方式完成此操作:

var Namespace = Namespace || {}

在您的例子中,如果已经定义了
三角剖分
类,那么它只是为了防止重新指定该类。

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

在您的场景中,我们正在检查是否已声明三角剖分,然后需要计算函数表达式并将其分配给三角剖分。

var Triangulation=Triangulation | |(function(){

我们在Javascript中使用了几种操作符,如&&(and)| |(or) 还有!(不是)操作员

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

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

| |运算符用于确定任一条件是否为真

例如:

如果(x==5 | | y==5) { .... .... }


谢谢。

可能是一种只设置一次的方法吗?检查这一步…
var Triangulation=Triangulation | | |(function(){
只是意味着如果在执行此步骤之前声明了
Triangulation
,则跳过该步骤。否则继续执行函数{}中的代码。为什么这个问题得到了这么多的支持?我的意思是这个问题已经被问过很多次了。非常感谢你的回答。我很欣赏你对命名空间问题的见解。@Nikhil,这与你链接到的线程(我已经读过)不同。这不是| |做什么的问题,而是为什么在这种情况下使用它。此模式的一个常见用法是在创建“名称空间”时。例如,您可以定义:$=$$$|{};$.app=$.app |{};$.app.something=$.app.something.|{};然后,您可以在每个文件的顶部包含相同的基本内容,以确保您的名称空间已定义,并且您的定义不会相互冲突。这与问题无关。
var Namespace = Namespace || {}