Простая программа Js подходит для NaN и objectHtmlSpanElement [duplicate]

Попробуйте использовать в этом контексте обычные for loop и splice, чтобы выполнить вашу работу,

var arr = [false,1,0,1,2,0,1,3,"a"];
for(var i=arr.length;i>0;i--){
  if(arr[i] === 0){  arr.push(arr.splice(i,1).pop()); }
}
console.log(arr); //[false, 1, 1, 2, 1, 3, "a", 0, 0]
document.body.innerHTML += JSON.stringify(arr);

35
задан Flimzy 18 December 2012 в 01:14
поделиться

7 ответов

Строка ECMAScript 5 должна помочь с этим, поскольку вы не можете использовать необъявленные переменные . Я не уверен, какие браузеры в настоящее время поддерживают строгий режим, но я знаю, что Firefox 4. делает.

В спецификации HTML, которую вы указали, упоминается предложение уменьшить загрязнение глобальной сферы, ограничивая это поведение причудами - только .

Я не знаю, находится ли эта функция в исходной спецификации, но я ожидаю, что она будет удалена, запрещена или иным образом аннулирована в последующих версиях ECMAScript. ES6 будет основан на строгом ES5.

В JavaScript есть много функций, которые облегчают использование новичков и новичков, я подозреваю, что это одна из таких функций. Если вы профессионал и хотите, чтобы качественный код использовал "use strict"; и всегда JSLint ваш код. Если вы используете эти рекомендации, эта функция никогда не должна вас беспокоить.

Вот полезное видео о ES5 , предоставленное YUI Theater (ему уже 2 года хотя, но все еще актуально в настоящее время, поскольку ES6 еще нет).

9
ответ дан Halcyon 18 August 2018 в 20:48
поделиться

Это то, что я смог придумать для удаления глобальных переменных, которые автоматически создаются для объектов DOM с идентификационным значением:

function clearElementGlobals() {
    function clearItem(iden, item) {
        if (iden && window[iden] && (window[iden] === item)) {
            window[iden] = undefined;
        }
    }

    var list = document.getElementsByTagName("*");
    for (var i = 0, len = list.length; i < len; i++) {
        var item = list[i];
        clearItem(item.id, item);
        clearItem(item.name, item);
    }
}

Это получает список всех объектов в стр. Он просматривает поиск значений с идентификатором и когда для него существует значение id, и для него существует глобальная переменная, и эта глобальная переменная указывает на этот объект DOM, эта глобальная переменная имеет значение undefined. Как выясняется, браузеры также делают это же авто-глобальное для некоторых типов тегов с атрибутом имени (например, элементами формы), поэтому мы также очищаем их.

Конечно, этот код не может знать, собственный код делает глобальную переменную с тем же именем, что и идентификатор, поэтому было бы лучше либо не делать этого в вашем собственном коде, либо вызвать эту функцию до того, как будут инициализированы ваши глобальные переменные.

К сожалению, вы не можете удалить глобальные переменные в javascript, поэтому установить его в undefined - это лучшее, что можно сделать.

FYI, я пробовал делать это по-другому, где вы перечисляете глобальные переменные, которые ищут переменные, являющиеся экземпляром HTMLElement и которые имеют имя, которое соответствует идентификатору элемента, на который они указывают, но я не смог найти надежный способ перечислить глобальные переменные. В Chrome вы не можете перечислять их на объект окна, даже если вы можете получить к ним доступ через объект окна. Итак, мне пришлось пойти наоборот, получив все объекты DOM с идентификатором и поиская глобальные переменные, которые соответствуют им.

FYI, вы спросили о строгом режиме в своем вопросе. строгий режим применяется только к заданной области кода, поэтому не было бы никакого способа заставить его влиять на способ создания глобального пространства имен. Чтобы повлиять на что-то подобное, это должно было быть что-то на уровне документа до того, как документ был разобран как опция DOCTYPE или что-то в этом роде.

Предостережения с этой функцией.

  1. Запустите его, прежде чем создавать какие-либо из ваших собственных глобалов или не создавайте никаких своих глобальных глобалов с тем же именем, что и атрибут ID или name, который также указывает на этот объект DOM.
  2. Это одноразовый, не непрерывный. Если вы динамически создаете новые объекты DOM, вам придется перезапустить эту функцию, чтобы очистить все новые глобальные переменные, которые могли быть сделаны из новых объектов DOM.
  3. Глобалы заданы как неопределенные, которые немного отличаются от if их никогда не было в первую очередь. Я не могу придумать случай программирования, где это действительно имеет значение, но оно не идентично. К сожалению, вы не можете удалить глобальные переменные.
6
ответ дан jfriend00 18 August 2018 в 20:48
поделиться
  • 1
    Это болезненно, к счастью, вам не нужно это делать. Просто убедитесь, что вы всегда объявляете свои переменные. Используйте JSLint. – Halcyon 23 August 2011 в 19:44

Я не думаю, что есть способ отключить его, но вам не нужно придавать ему большое значение. Если вы боитесь непредсказуемых ошибок, вы можете избежать их, используя JSHint или JSLint . Они помогут вам избежать ошибок. Например, они будут предупреждать вас, если вы используете необъявленную переменную.

2
ответ дан Sanghyun Lee 18 August 2018 в 20:48
поделиться

Да, большинство браузеров делают это, но потом снова, как вы сказали, некоторые не делают (firefox), поэтому не рассчитывайте на это. Также легко переписать эти переменные в js, я могу себе представить, что что-то вроде container может быть перезаписано прямо на летучей мыши кем-то, использующим эту переменную, не объявляя ее в первую очередь.

Невозможно включить это в chrome afaik, но даже тогда это может быть хлопот, чтобы понять это и исправить его для всех браузеров.

Не придавайте этому слишком большого значения, но остерегайтесь этого. Это одна из тех причин, по которой вы избегаете глобальной области переменных.

. Для завершения этих браузеров это делается по умолчанию: Chrome, IE9 & amp; compat, Opera

Обновление: будущие версии ECMAScript могут включать в себя некоторую опцию, так как да, обсуждение продолжается, но это не будет исправлять проблему в старых браузерах.

3
ответ дан sg3s 18 August 2018 в 20:48
поделиться
  • 1
    Четыре года спустя, но для чего это стоит, современный Firefox делает . Я был удивлен (и в ужасе), обнаружив, что довольно значительный фрагмент кода на нашем сайте, используемый на нескольких страницах, полагается на него , но у нас не было никаких сообщений об ошибках. Таким образом, он кажется надежным - пока что-либо. Конечно, я не одинок в своей команде в своем ужасе относительно этого открытия, и мы, безусловно, собираемся реорганизовать его при следующей возможности, так как мы тоже не доверяем, но для чего это стоит. – KRyan 3 April 2015 в 19:49

Проблема в том, что глобальная область видимости содержит объекты, определенные в ней во время выполнения браузером, и вы хотите, чтобы эти определения не мешали вашему коду. Я не знаю, как отключить это поведение, но у меня есть два способа обхода:

1) Как показано в статье, с которой вы связаны, вы можете обойти это, убедившись, что вы определите каждую переменную перед ее использованием. Я бы достиг этого, выполнив мой код через JSLint , который предупреждает об этом (в дополнение к совокупности других распространенных ошибок).

2) Однако, поскольку это можно забыть запустить код через JSLint, вы можете предпочесть шаг в цепочке инструментов, который вы не можете забыть. В этом случае посмотрите CoffeeScript - это langauge, очень похожая на javascript, которую вы компилируете в javascript перед использованием, и введет правильные определения var для вас. На самом деле, я подозреваю, что вы не можете писать код, который опирается на автоматическую создание переменных элементов с помощью CoffeeScript.

2
ответ дан Timothy Jones 18 August 2018 в 20:48
поделиться
  • 1
    Я добавил привязку после фиксации к моему SVN-серверу, который будет проверять все .js файлы с помощью JSLint. Очень полезно. – Halcyon 23 August 2011 в 19:45
  • 2
    Неплотная идея - спасибо! – Timothy Jones 24 August 2011 в 01:28
6
ответ дан jfriend00 7 September 2018 в 04:48
поделиться
6
ответ дан jfriend00 30 October 2018 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: