Несовместимая область применения «строгого использования» в различных веб-браузерах (в отношении arguments.callee и вызывающей стороны)
Ситуация:
Я нашел что-то странное в отношениистрогий режим в JavaScript
Я использую внешнюю стороннюю библиотеку Javascript, котораябыл минимизирован,имеет более 4000 строк кода,являетсяне с помощьюuse strict
на всех, ииспользуетarguments.callee
.Я используюuse strict
в моем собственном коде, ограниченном внутри функции.Когда я вызываю одну из функций, предоставляемых библиотекой, она выдает ошибку. Тем не мение,
ошибка выдается только если я используюuse strict
ошибка выдается во всех браузерах кроме ChromeКод:Я удалил все несвязанные вещи и сократил код в этом (онлайн демо на jsFiddle):
// This comes from the minified external JS library.
// It creates a global object "foo".
(function () {
foo = {};
foo.bar = function (e) {
return function () {
var a5 = arguments.callee;
while (a5) {
a5 = a5.caller // Error on this line in all browsers except Chrome
}
}
}("any value here");
})();
// Here's my code.
(function() {
"use strict"; // I enable strict mode in my own function only.
foo.bar();
alert("done");
})();
Результат испытаний:+-----------------------+-----+--------------------------------------------------------------+
| Browser | OS | Error |
+-----------------------+-----+--------------------------------------------------------------+
| Chrome 27.0.1453.94 m | Win | <<NO ERROR!>> |
| Opera 12.15 | Win | Unhandled Error: Illegal property access |
| Firefox 21.0 | Win | TypeError: access to strict mode caller function is censored |
| Safari 5.1.7 | Win | TypeError: Type error |
| IE 10 | Win | SCRIPT5043: Accessing the 'caller' property of a function or |
| | | arguments object is not allowed in strict mode |
| Chrome 27.0.1543.93 | Mac | <<NO ERROR!>> |
| Opera 12.15 | Mac | Unhandled Error: Illegal property access |
| Firefox 21.0 | Mac | TypeError: access to strict mode caller function is censored |
| Safari 6.0.4 | Mac | TypeError: Function.caller used to retrieve strict caller |
+-----------------------+-----+--------------------------------------------------------------+
Примечание: дляOS
, Win
= Windows 7,Mac
= Mac OS 10.7.5
use strict
(видетьМогу ли я использовать).use strict
находится в пределах моей функции, поэтому все, что определено вне ее области действия, не затронуто (см.этот вопрос переполнения стека).Вопрос:Итак, все ли браузеры, кроме Chrome, не правы? Или наоборот? Или это неопределенное поведение, поэтому браузеры могут использовать его в любом случае?