1

每个函数对象都应该有两个“隐藏”属性(根据 JavaScript The Good Parts, The Functions Chapter )

context

code

有没有办法访问这些属性?

4

1 回答 1

2

好吧,您可以很容易地访问函数代码 - 通过使用toString()(或 Mozilla 的非标准toSource()):

var x = function() { alert('Here is my happy function'); };
console.log(x.toString());

至于上下文,我想 DC 的意思不仅仅是 simple this,而且实际上写了关于 Execution Context 的文章。

更新:在ES5 规范中找到了一个有趣的片段,其中这两个属性实际上是在一些细节中描述的——而不是作为抽象概念:

13.2 创建函数对象

给定由 FormalParameterList 指定的可选参数列表、由FunctionBody指定的主体、由Scope指定的词法环境 和布尔标志 Strict,函数对象的构造如下:

...

将 F 的 [[Scope]] 内部属性设置为 Scope 的值。

...

将 F 的 [[Code]] 内部属性设置为 FunctionBody。

同时:

词法环境和环境记录值纯粹是规范机制,不需要对应于 ECMAScript 实现的任何特定工件。ECMAScript 程序不可能直接访问或操作这些值。

所以我想这结束了关于访问Scope函数属性的问题。

至于Code属性,它的只读访问toString(),正如马特正确注意到的那样,是依赖于实现的——但更多的是实现。)

于 2012-09-04T18:13:50.767 回答