Можно ли сказать, что узел-компилятор некоторое время игнорирует строгий режим?
Первый работает как положено:
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. Это не происходит из строгого режима в вашем коде. Я не знаю ни одного способа изменить это. Я думаю, что вам придется пойти с вашим обходным путем.