Можно ли сказать, что компилятор узла какое-то время игнорирует строгий режим?

Первый работает как положено:

var f1 = Object.getOwnPropertyNames(Function)
    .forEach(function(element) {
         console.log (typeof Function[element]);
    });  //  --> number, string, function

Второй выводит сообщение об ошибке:

var f2 = Object.getOwnPropertyNames(Function.prototype)
    .forEach(function(element) {
        console.log (typeof Function.prototype[element]);
});

TypeError: свойства "вызывающий", "вызываемый" и "аргументы" могут быть недоступны в строгом режиме.

Как это обойти?

Изменить: текущий обходной путь

var forbiddenOnStrictMode = ['caller', 'callee', 'arguments'];

var f2 = Object.getOwnPropertyNames(Function.prototype)
    .forEach(function(element) {
        if (forbiddenOnStrictMode.indexOf(element) == -1)
        console.log (typeof Function.prototype[element]);
});

Можно ли сказать, что компилятор узла какое-то время игнорирует строгий режим?


person Lonely    schedule 26.12.2017    source источник
comment
Каков контекст этого кода? Что заставляет его в строгий режим в первую очередь? Это в определении метода класса? Насколько мне известно, вы не можете отменить определение строгого режима, но, возможно, вы могли бы переместить код в другое место, не находящееся в строгом режиме, и вызвать его.   -  person jfriend00    schedule 26.12.2017
comment
Я просто хочу создать документацию для JS-методов функций (если Function.prototype[whatever] == 'function', то создайте заголовок в документе. Но, например, Function.prototype.caller недоступен в строгом режиме (= режим по умолчанию), и поэтому вы не можете получить доступ к существующему метод, потому что компилятор говорит НЕТ.   -  person Lonely    schedule 26.12.2017
comment
Вопрос, который я пытаюсь задать, заключается в том, что внутри этого кода и почему он находится в строгом режиме? Код node.js по умолчанию не находится в строгом режиме, поэтому что-то, что вы делаете, заставляет его работать в строгом режиме. Я хочу знать, почему это в строгом режиме. Какой контекст кода заставляет его работать в строгом режиме? Возможно, вы можете переместить этот код за пределы строгого режима и вызвать его.   -  person jfriend00    schedule 26.12.2017
comment
Вы можете попробовать следующее в консоли браузера: Object.getOwnPropertyNames(Function.prototype).forEach(function(element) {console.log (typeof Function.prototype[element]);}) Копировать+вставить+Ввод   -  person Lonely    schedule 26.12.2017
comment
Вы не отвечаете на мой вопрос - я не понимаю почему. Консоль браузера — нестандартное место, поэтому я не буду пытаться что-то решать или объяснять в консоли. Если у вас есть реальный код, по которому вам нужна помощь в решении реальной проблемы, покажите контекст настоящего кода. В противном случае я просто перейду к реальной проблеме, чтобы решить ее в другом месте.   -  person jfriend00    schedule 26.12.2017
comment
Это именно тот реальный код выше, в среде узла или браузера вы получите тот же результат, даже если вы не добавили "use strict"; и т. д., это стандартное поведение в самых последних версиях узлов, а также в браузерах. Теперь должен быть способ сказать узлу деактивировать строгий режим.   -  person Lonely    schedule 26.12.2017
comment
Итак, этот код находится внутри модуля node.js? Какая версия node.js? Браузеры по умолчанию НЕ используют строгий режим, за исключением определенных новых функций ES6, и они не могут этого сделать по причинам совместимости. Насколько я знаю, нет способа отключить строгий режим после его включения. Вам нужно было бы определить код в месте, где строгий режим не был включен, а затем вы могли бы вызвать его из функции строгого режима.   -  person jfriend00    schedule 26.12.2017
comment
это файл, например. myFileName.js, и вы запускаете его с помощью node myFileName.js в своем терминале.   -  person Lonely    schedule 26.12.2017
comment
Мое тестирование в узле v8.8.1 показывает, что простой запуск файла, как вы сказали, НЕ находится в строгом режиме. Я думаю, что вы видите несколько вводящее в заблуждение сообщение об ошибке. Это не тот код, который вы используете в строгом режиме. Вы пытаетесь получить доступ к чему-то на Function.prototype, которое само по себе помечено как определенное в строгом режиме.   -  person jfriend00    schedule 26.12.2017


Ответы (1)


Мое тестирование в узле v8.8.1 показывает, что простой запуск файла, как вы сказали, НЕ находится в строгом режиме. Я думаю, что вы видите несколько вводящее в заблуждение сообщение об ошибке. Это не тот код, который вы используете в строгом режиме. Вы пытаетесь получить доступ к чему-то в Function.prototype, которое само по себе помечено как определенное в строгом режиме, и поэтому интерпретатор отказывается предоставить вам доступ к этим свойствам этого объекта.

Можно ли сказать, что компилятор узла какое-то время игнорирует строгий режим?

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

const isStrict = (function() { return !this; })();
console.log("strict mode", isStrict);

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

person jfriend00    schedule 26.12.2017