Могу ли я отключить строгий режим ECMAscript для определенных функций?
Я не нахожу ничего о моем вопросе здесь на MDC или спецификации ECMAscript. Вероятно, кто-то знает более "хаки" способ решить эту проблему.
Я звоню "use strict" на каждый файл javascript в моей среде. Все мои файлы начинаются так
(function(win, doc, undef) {
"use strict";
// code & functions
}(window, window.document));
теперь у меня есть пользовательская функция, которая обрабатывает ошибки. Что функции использует .caller свойство для предоставления трассировка стека контекста. Выглядит так:
var chain = (function() {
var _parent = _error,
_ret = '';
while( _parent.caller ) {
_ret += ' -> ' + _parent.caller.name;
_parent = _parent.caller;
}
return _ret;
}());
но конечно, в строгом режиме .caller является не удаляемой опорой, которая бросает при извлечении. Так что мой вопрос, кто-нибудь знает способ отключить строгий более "функциональный"?
"use strict"; наследуется всеми функциями после его вызова. Теперь у нас есть возможность просто использовать строгий режим в определенных функциях, просто вызывая "use strict"; в верхней части, но есть ли способ, чтобы добиться обратного ?
3 ответов:
нет, вы не можете отключить строгий режим для каждой функции.
важно понимать, что строгий режим работает лексически; значение-это влияет на объявление функции, а не выполнение. Любая функция объявил внутри строгого кода становится сама строгая функция. Но не любая функция под названием изнутри строгий код обязательно строг:
(function(sloppy) { "use strict"; function strict() { // this function is strict, as it is _declared_ within strict code } strict(); sloppy(); })(sloppy); function sloppy(){ // this function is not strict as it is _declared outside_ of strict code }обратите внимание, как мы можем определить функцию вне строгого код а затем передать его в функцию, которая является строгой.
вы можете сделать что - то подобное в своем примере-иметь объект с "небрежными" функциями, а затем передать этот объект в эту строгую немедленно вызываемую функцию. Конечно, это не сработает, если "неаккуратные" функции должны ссылаться на переменные из основной функции-оболочки.
также обратите внимание, что косвенные оценки - предложил кто - то другой-не очень поможет здесь. Все, что он делает, это выполнить код в глобальный контекст. Если вы попытаетесь вызвать функцию, которая определена локально, косвенное eval даже не найдет ее:
(function(){ "use strict"; function whichDoesSomethingNaughty(){ /* ... */ } // ReferenceError as function is not globally accessible // and indirect eval obviously tries to "find" it in global scope (1,eval)('whichDoesSomethingNaughty')(); })();эта путаница в отношении global eval, вероятно, связана с тем, что global eval можно использовать для получения доступа к глобальному объекту из строгого режима (который не просто доступен через
(от http://javascriptweblog.wordpress.com/2011/05/03/javascript-strict-mode/)
(...) Строгий режим не применяется нестрогие функции, которые вызываются внутри тела строгая функция (либо потому, что они были переданы как аргументы или вызывается с помощью
callилиapply).поэтому, если вы настроите методы ошибок в другом файле, без строгого режима, а затем передадите их в качестве параметра, например это:
var test = function(fn) { 'use strict'; fn(); } var deleteNonConfigurable = function () { var obj = {}; Object.defineProperty(obj, "name", { configurable: false }); delete obj.name; //will throw TypeError in Strict Mode } test(deleteNonConfigurable); //no error (Strict Mode not enforced)...это должно сработать.
альтернатива просто делает это
var stack; if (console && console.trace) { stack = console.trace(); } else { try { var fail = 1 / 0; } catch (e) { if (e.stack) { stack = e.stack; } else if (e.stacktrace) { stack = e.stacktrace; } } } // have fun implementing normalize. return normalize(stack);
Comments