此代码抛出错误.
try {
alert(hasOwnProperty('window'));
} catch(e) {
alert(e); // Type Error : can't convert undefined to object
}
Run Code Online (Sandbox Code Playgroud)
但是这段代码不会引发错误.
try {
alert(this.hasOwnProperty('window')); // true (if on browser)
} catch(e) {
// through catch block
alert(e);
}
Run Code Online (Sandbox Code Playgroud)
就我而言,func(arg)等于this.func(arg)是否this为Global Object.为什么会发生这样的事情?
以下代码似乎在Chrome下未按预期运行,并且在Firefox中运行方式不同.
(function () {
'use strict';
var
arr = Object.freeze([1, 2, 3]);
try {
arr.push(4);
} catch (e) {
console.log(e);
}
try {
console.log(arr.pop());
}catch (e) {
console.log(e);
}
console.log(arr);
})();
Run Code Online (Sandbox Code Playgroud)
我预计输出将是:
Error : (for `arr.push(4)`)
Error : (for `arr.pop()`)
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
但是当在Chrome 29.0.1547.49(官方版本216092)beta-m上运行此代码时,我收到以下输出:
3
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
为什么没有例外?我在Firefox Nightly 26.0a1(2013-08-12)上运行了这段代码,结果是
TypeError: arr.push(...) is not extensible
TypeError: property arr.pop(...) is non-configurable and can't be deleted
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
正如我所料.
我想到了为什么Chrome和Firefox之间存在差异,然后我意识到这可能是因为严格的模式pop和push方法.综上所述,在Firefox(SpiderMonkey)pop和push方法中都是以严格模式定义的,但在Chrome(V8)中这些方法并没有在严格模式下定义.
我不知道实际的规格是什么.(我读了一些ECMA-262第5.1版,但我找不到这样的部分.)