Niespójny zakres „ścisłego stosowania” w różnych przeglądarkach internetowych (dotyczących argumentów.callee i wywołującego)
Sytuacja:
Znalazłem coś dziwnegotryb ścisły w Javascript.
Korzystam z zewnętrznej, zewnętrznej biblioteki JavaScript, którazostał zminimalizowany,ma ponad 4000 linii kodu,jestnie za pomocąuse strict
w ogóle, ijest używanearguments.callee
.ja używamuse strict
w moim własnym kodzie, w zasięgu funkcji.Gdy wywołam jedną z funkcji udostępnianych przez bibliotekę, zgłasza błąd. Jednak,
błąd jest generowany tylko wtedy, gdy używamuse strict
błąd jest generowany we wszystkich przeglądarkach oprócz ChromeKod:Usunąłem wszystkie niepowiązane rzeczy i zredukowałem kod do tego (demo online na 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");
})();
Wynik testu:+-----------------------+-----+--------------------------------------------------------------+
| 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 |
+-----------------------+-----+--------------------------------------------------------------+
Uwaga: dlaOS
, Win
= Windows 7,Mac
= Mac OS 10.7.5
use strict
(widziećMogę uzyć).Theuse strict
jest w zasięgu mojej funkcji, więc nie ma to wpływu na wszystko zdefiniowane poza jego zakresem (zobaczto pytanie o przepełnienie stosu).Pytanie:Czy wszystkie przeglądarki oprócz Chrome są nieprawidłowe? Czy jest odwrotnie? Czy może jest to niezdefiniowane zachowanie, aby przeglądarki mogły go wdrożyć w dowolny sposób?