如果将全局变量定义为“ 0”,为什么变量“ closed”记录为“ false”?

时间:2018-06-27 12:18:12

标签: javascript variables scope

我知道这一定是非常基础的内容,但我不了解示波器的工作方式。我希望在整个JavaScript文件中都知道closed变量。

我有类似的东西(在jQuery中):

var closed = 0;

$(function(){
  console.log(closed);
});

但是closed被记录为false。我使用loadonload函数尝试了很多事情,但是失败了。

2 个答案:

答案 0 :(得分:1)

使用let代替var,因为closed是JavaScript运行时使用的全局变量,因此要使其在代码范围内是局部的,可以使用let var的值,它考虑了全局closed属性,将变量设置为全局范围。

let closed=0;
$( function() {
    console.log(closed);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

答案 1 :(得分:1)

closed是指window.closed;它始终是布尔值,对其进行重新定义会产生短绒警告,如closed的重新定义”

  

只读属性指示是否关闭了所引用的窗口。


行为类似的变量可以在以下列表中找到:

运行代码段以获取无法在全局范围内安全使用的变量名的完整列表:

const props = Object.entries(Object.getOwnPropertyDescriptors(window)),
  undesirable = {
    set: (desc) => desc,
    configurable: (desc) => !desc,
    writable: (desc) => !desc
  };

Array.from(document.querySelectorAll("[id]"))
  .forEach((span) => span.innerHTML = props
    .filter(([prop, {[span.id]: desc}]) => undesirable[span.id](desc))
    .map(([prop]) => `<code>${prop}</code>`)
    .join(", "))
code{
  background: #eee;
  padding: 1px 3px;
}
<p>Properties that have a Setter which may change the type or the action, when a value is set to it:</p>
<span id="set"></span>

<hr/>

<p>Properties that are not configurable (no type change allowed):</p>
<span id="configurable"></span>

<hr/>

<p>Properties that are read-only:</p>
<span id="writable"></span>

您会注意到,这是一个很多。它也有很多简短的常用变量名,例如namelength [1][2]status [1][2]selftopmenubarparent。此外,关于在二传手身上分配动作的变化,类似var location = "Podunk, USA";的人实际上redirects./Podunk, USA的位置。


故事的寓意:避免使用全局变量。他们只会与其他全局属性发生冲突。始终使用范围变量,例如在IIFE中:

(function(){
  var closed = 0;

  $(function(){
    console.log(closed);
  });
})();

使用let代替var是另一种解决方案。

由于我的大多数代码都没有使用jQuery,所以我更喜欢将所有内容包装在DOMContentLoaded侦听器中,在这里我可以确定所需的所有变量的范围,此外,请使用"use strict";

// My personal boiler-plate:

addEventListener("DOMContentLoaded", function(){ "use strict";
  // Code goes here.
});