情况:
我在 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
范围在我的函数内,因此在其范围之外定义的所有内容都不会受到影响(请参阅此 Stack Overflow 问题)。
问题:
那么,除了 Chrome 之外的所有浏览器都错了吗?还是相反?或者这是未定义的行为,所以浏览器可以选择以任何一种方式实现它?