Почему переменная `closed` записывается как` false`, если я определяю ее глобально как `0`? - PullRequest
0 голосов
/ 27 июня 2018

Я знаю, что это должно быть очень просто, но я не понимаю, как работает прицел. Я хочу, чтобы переменная closed была известна во всем файле JavaScript.

У меня что-то подобное (в jQuery):

var closed = 0;

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

Но closed регистрируется как false. Я пробовал много вещей с функциями load и onload, но мне не удалось.

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

closed относится к window.closed; это всегда логическое значение, и при его переопределении выдается предупреждение linter, например «Переопределение 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>

Вы заметите, это лот . Это также множество коротких, общих имен переменных, таких как name, length [1] , [2] , status [1] , [2] , self, top, menubar и parent. Кроме того, что касается изменения действия при назначении после сеттеров, что-то вроде var location = "Podunk, USA"; на самом деле перенаправляет вас в местоположение ./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.
});
0 голосов
/ 27 июня 2018

Используйте 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...