小编Hos*_*aki的帖子

在Global Scope上调用Object.prototype方法

此代码抛出错误.

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.为什么会发生这样的事情?

javascript

7
推荐指数
1
解决办法
292
查看次数

在Chrome中的冻结阵列上推送并弹出不会引发异常

以下代码似乎在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之间存在差异,然后我意识到这可能是因为严格的模式poppush方法.综上所述,在Firefox(SpiderMonkey)poppush方法中都是以严格模式定义的,但在Chrome(V8)中这些方法并没有在严格模式下定义.

我不知道实际的规格是什么.(我读了一些ECMA-262第5.1版,但我找不到这样的部分.)

javascript ecma262 ecmascript-5

4
推荐指数
1
解决办法
668
查看次数

标签 统计

javascript ×2

ecma262 ×1

ecmascript-5 ×1