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

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

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: в строгом режиме нельзя получить доступ к свойствам 'caller', 'callee' и 'arguments'

Как я могу обойти это?

Изменить: Текущее решение

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]);
});

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

1 ответ

Решение

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

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

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

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

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

Другие вопросы по тегам