Могу ли я отключить строгий режим 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"; в верхней части, но есть ли способ, чтобы добиться обратного ?

394   3  

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

    Ничего не найдено.