SyntaxError: операторы with недействительны в строгом режиме

Я получаю эту ошибку в консоли сафари, когда пытаюсь что-то сделать с точки останова. Отчет об ошибке здесь: https://bugs.webkit.org/show_bug.cgi?id=83267.

У кого-нибудь есть обходной путь? По причинам, которые, как я предполагаю, связаны с тем, что этот javascript перестал работать на моем сайте в сафари.

редактировать: отчет об ошибке также содержит шаги воспроизведения.

другое редактирование: я не использую оператор with. Это ошибка консоли сафари.


person quinn    schedule 31.08.2012    source источник
comment
Не для Safari. 'use strict';with(this); в FF/Chrome создает код строгого режима, который не может содержать операторы with.   -  person Rob W    schedule 31.08.2012
comment
Особенность Safari заключается в том, что если вы попытаетесь оценить что-либо в консоли отладчика в области "use strict";, вы получите эту ошибку, даже если вы не видите слова with нигде в своем сценарии или в том, что вы набрали. Судя по всему, Safari оборачивает все, что вы набрали, в with и пытается это оценить. Дополнительные сведения см. в упомянутом отчете об ошибке.   -  person Kristopher Johnson    schedule 23.01.2013
comment
возможный дубликат Не удается проверить переменную области при использовании строгого режима   -  person Lance Fisher    schedule 14.01.2014


Ответы (2)


Оператор with(obj) {} устарел и поэтому недействителен в строгом режиме.

Чтобы решить эту проблему, либо отключите строгий режим, либо прекратите использовать операторы with!

person Eric    schedule 31.08.2012
comment
Технически я не использую with (думаю, сафари используется внутри?), но это мой тип документа: ‹!DOCTYPE html› ... это то, что означает strict в данном контексте? - person quinn; 31.08.2012
comment
Неа. Строгий режим включается с помощью "use strict" в верхней части вашего JS-файла. - person Eric; 31.08.2012
comment
Итак, я думаю, что обходной путь будет состоять в том, чтобы удалить «использовать строгость» везде, где я могу его найти, пока Safari не исправит эту ошибку? - person quinn; 31.08.2012
comment
@quinn: Наверное, да. Если только сафари не использует "use strict" внутри себя. - person Eric; 31.08.2012
comment
@quinn: Что, если вы добавите "use strict"; внутрь функции, а не в файл? Это имеет значение? Таким образом, это должно применяться только к содержимому функции. - person Tadeck; 31.08.2012
comment
@Eric Я удалил «использовать строго», и все работает, кажется, отладчик сафари не работает в контексте с «использовать строго»; :( Спасибо за вашу помощь! - person quinn; 31.08.2012
comment
Это не OP, использующий with, это код консоли Safari. - person gotofritz; 30.09.2014
comment
Почему это обесценено? Это позволяет вам красиво ограничить видимую область, не изобретая свой собственный менее выразительный function using(object, callback){ callback(object); }. Это приятно для const obj = {}; using(require('fs'), (fs) =>{obj['one']=fs.readFileSync('one.txt'); obj['two']=fs.readFileSync('two.txt')}) - person Dmitry; 08.07.2016
comment
@Dmitry: Потому что это означает, что правила разрешения имен и области действия должны выполняться во время выполнения, а не во время компиляции. Никакая другая языковая конструкция в javascript не ведет себя так. - person Eric; 08.07.2016

Строгий режим в ECMAScript 5 запрещает, например. with заявление. У вас есть два варианта:

  • отключить строгий режим (удалить "strict mode"; строку из файла/функции) или
  • (предпочтительно) избегайте использования операторов with - они вредны и совершенно нечитаемы.

Подробнее о строгом режиме от Джона Резига: Строгий режим ECMAScript 5, JSON и многое другое.

Вы можете прочитать в статье, что строгий режим:

  • делает невозможным delete переменную (как в delete foo;),
  • ограничивает использование eval,
  • добавляет некоторые ограничения к функциям (например, доступ к caller и callee),
  • удаляет операторы with,
person Tadeck    schedule 31.08.2012
comment
Это не OP, использующий with, это код консоли Safari. - person gotofritz; 30.09.2014
comment
Может ли кто-нибудь указать рекомендуемую замену на с? - person Ya.; 12.05.2021