0

Firefox 的 js 引擎/gjs (spidermonkey) 和 webkit 的 jscore 在非对象上调用内置和普通 js 函数时似乎有不同的行为。

gjs> toString.call(null)
"[object Null]"
gjs> function cccc() {return toString.call(this);}
gjs> cccc.call(null)
"[object GjsGlobal]"

因此,如果使用非对象调用普通的 js 函数,它this会自动被 current 替换this,而对于内置函数则不会发生这种情况。

这是标准行为(根据某些规范?)还是只是依赖于实现的行为?第一行检查任何值的类型总是安全的吗?

谢谢

4

2 回答 2

2

这种行为是设计使然。如Mozilla 文档中所述:

注意,这可能不是方法看到的实际值:如果方法是非严格模式代码中的函数nullundefined将被替换为全局对象,原始值将被装箱。

显然,内置函数被(视为)严格模式代码。你自己的函数不是,当然,除非你写了一个严格模式函数。:-)

这在 ECMAScript 5 中会有所不同。来自规范(PDF)

注意 thisArg 值作为this值不加修改地传递 。这是对第 3 版的更改,其中undefinednull thisArg 被替换为全局对象并ToObject应用于所有其他值,并且该结果作为 this 值传递。

这是规范的非规范但 HTML 版本的更直接链接。

于 2012-06-05T09:18:43.143 回答
1

您可以在此处找到更多信息:https ://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call

这是 ECMAScript 第 3 版定义的标准行为,是的,这是一种检查任何值类型的方法,通常用于检查数组。

于 2012-06-05T09:07:00.367 回答