我正在读一本JavaScript语言的教科书.在我研究封闭主题的同时,我提出了以下问题.
考虑到这个功能:
function foo() {
extractPropsToCurrentContext({'prop1' : 'hello', 'prop2' : 123});
}
Run Code Online (Sandbox Code Playgroud)
我想要上面代码的结果,等于:
function foo() {
var prop1 = 'hello';
var prop2 = 123;
}
Run Code Online (Sandbox Code Playgroud)
那么,我的问题是,如何实现函数extractPropsToCurrentContext(/*Object*/)?
为了澄清,我想将对象的这些属性提取到执行上下文中,而不是在'this'指针下.(因此,那些提取的道具应该在该函数内部是私有的).
另外要澄清一点,你不能假设用'new'调用foo.(比如新的foo())
更新:
我的意思是,有没有可能我们可以使用任何hacky技巧来绕过浏览器的限制,更接近我们想要的结果?就像多年前一样,我们发明了JSONP用于跨域,长时间推送消息等等?
\n\n\n我想将对象的这些属性提取到执行上下文中
\n
执行上下文实际上由三部分组成:
\n\n您说过ThisBinding您不想更改或扩展的 。
the VariableEnvironment,保存声明的变量和函数。这就是您的同等代码将改变的内容。您可以使用以下 hack 来更改它:
function getVariableDeclaration(obj) {\n return "var " + Object.keys(obj).map(function(name) {\n return name + " = " + JSON.stringify(obj[name]);\n }).join(",\\n ") + ";";\n}\nfunction foo() {\n eval(getVariableDeclaration({\'prop1\' : \'hello\', \'prop2\' : 123}));\n debugger;\n}\nfoo();\nRun Code Online (Sandbox Code Playgroud)\n\n但是,这仅适用于非严格模式。检查\xc2\xa710.4.2了解详细信息。此外,此 hack 目前仅限于 JSON 可序列化值,如果您需要分配任意值,它会变得更加难看 -eval必须在您想要更改的环境中使用。
,它LexicalEnvironment保存当前标识符绑定(与相比,VariableEnvironment在执行过程中可能会发生变化)。这并不完全是您想要的,但可以通过with声明轻松修改:
function foo() {\n with ({\'prop1\' : \'hello\', \'prop2\' : 123}) {\n debugger;\n }\n}\nfoo();\nRun Code Online (Sandbox Code Playgroud)\n\n同样,它在严格模式下不起作用。有关其工作原理和隐藏其他绑定的信息,请参阅\xc2\xa712.10和\xc2\xa710.2.2.3 。
正如您所看到的,严格模式禁止对(非全局)执行上下文进行任何更改,因为这使得绑定成为非静态且不可优化的。大多数代码也变得更难理解,因此这通常被认为是一种不好的做法。
\n\n从学术角度思考此类黑客行为(以了解语言的工作原理)是很好的,但你永远不应该在生产中使用它们。无论您想到什么需要此类技术,都有更好的解决方案。
\n| 归档时间: |
|
| 查看次数: |
198 次 |
| 最近记录: |