Почему & ldquo; это & ​​rdquo; var не указывает на вызывающую функцию здесь? [Дубликат]

Вместо того, чтобы обертывать код в блоке try / catch, что происходит, когда вы регистрируете обработчик исключений? Очевидно, что ваш блок try / catch не перехватывает исключение, что приводит к ошибкам, зарегистрированным в Apache. Регистрируя обработчик, вы можете быть уверены, что любое неперехваченное исключение обрабатывается.

Кроме того, если вы используете пространства имен в своем приложении, убедитесь, что вы записываете \ Exception в свой блок catch (или включаете класс Exception через инструкцию использования).

9
задан AstroCB 11 April 2015 в 16:57
поделиться

2 ответа

Оператор группировки не уничтожает ссылки на свойства, которые провоцируют вызов метода .

Это явно указано в spec :

ПРИМЕЧАНИЕ. Этот алгоритм не применяет GetValue к результату оценки Expression. Основной мотивацией для этого является то, что операторы, такие как delete и typeof, могут быть применены к заключенным в скобки выражениям.

В ваших строках 4 и 5 это не скобка, а операторы (?: и ||), которые де-ссылаются на свойство и дают «несвязанную» функцию.

8
ответ дан Bergi 22 August 2018 в 12:25
поделиться
  • 1
    Хороший ответ, на самом деле есть общие трюки, чтобы «обойти». это наиболее распространенное явление, которое я видел, это (0,foo.bar), чтобы разбить ссылку или вызвать косвенный вызов без добавления строки. Это приводит к интересному примеру с eval тоже :) – Benjamin Gruenbaum 11 April 2015 в 21:37

foo.bar здесь анонимная функция.

Это может иметь смысл, если вы разделите его на разные строки:

foo = {
    bar: function() {
        return this;
    }
}

Итак, когда вы вызываете foo.bar, вы получаете function() { return this; }. В строке 2 вы вызываете эту функцию напрямую (foo.bar()), поэтому она возвращает this, экземпляр объекта (foo).

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

(foo.bar); // (function() { return this; }); A reference to the function
(foo.bar)(); // (function() { return this; })(); Actually calling the function

Поскольку в последнем случае вы выполняете функцию, как вы это делали в строке 2 результат тот же (foo).

В строках 4 и 5, однако, как сказал Берги, операторы, которые вы используете, разыгрывают их из функции, что оставляет вас с Window, а не foo.

3
ответ дан AstroCB 22 August 2018 в 12:25
поделиться
Другие вопросы по тегам:

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