首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在javascript中调用非对象函数的不同行为

问在javascript中调用非对象函数的不同行为
EN

Stack Overflow用户
提问于 2012-06-05 16:54:57
回答 2查看 278关注 0票数 0

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

代码语言:javascript
复制
gjs> toString.call(null)
"[object Null]"
gjs> function cccc() {return toString.call(this);}
gjs> cccc.call(null)
"[object GjsGlobal]"

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

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

THX

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-05 17:18:43

这种行为是有意为之的。正如Mozilla documentation中所指出的

请注意,这可能不是该方法所看到的实际值:如果该方法是non-strict mode代码中的一个函数,则null和undefined将被替换为全局对象,并且原始值将被装箱。

显然,内置函数(被视为)严格模式代码。当然,除非您编写了strict mode函数,否则您自己的函数就不是。:-)

这在ECMAScript 5中会有所不同。从specification (PDF)

注意,此thisArg值不加修改地作为

值传递。这是与版本3的不同之处,在版本3中,未定义的或null thisArg将替换为全局对象,并将ToObject应用于所有其他值,并将结果作为This值传递。

下面是该规范的一个非标准化的超文本标记语言版本的more direct link。

票数 2
EN

Stack Overflow用户

发布于 2012-06-05 17:07:00

你可以在这里找到更多信息:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10894289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档