gpt4 book ai didi

javascript - 如何在 JavaScript 中动态地向当前执行上下文添加属性?

转载 作者:搜寻专家 更新时间:2023-11-01 04:09:33 27 4
gpt4 key购买 nike

我正在阅读 JavaScript 语言的教科书。在研究闭包主题时,我想到了以下问题。

考虑这个功能:

function foo() {
extractPropsToCurrentContext({'prop1' : 'hello', 'prop2' : 123});
}

我想要上面代码的结果,等于:

function foo() {
var prop1 = 'hello';
var prop2 = 123;
}

所以,我的问题是,如何实现函数 extractPropsToCurrentContext(/* Object */) ?

澄清一下,我想将对象的那些属性提取到执行上下文,而不是“this”指针下。 (因此,那些提取的 Prop 在该函数中应该是私有(private))。

另一件需要澄清的事情是,您不能假设 foo 将通过“new”调用。 (比如新的 foo())

更新:

我的意思是,我们是否有可能使用任何hacky tricks 绕过浏览器的限制,从而更接近我们想要的结果?比如,几年前,我们为了跨域发明了 JSONP,为了消息推送而发明了长拉等等?

最佳答案

I want to extract those properties of the object into the execution context

execution context实际上包括三件事:

  • 您说过不想更改或扩展的 ThisBinding

  • VariableEnvironment,其中包含已声明的变量和函数。这就是你的平等代码会改变的。您可以使用以下 hack 更改它:

    function getVariableDeclaration(obj) {
    return "var " + Object.keys(obj).map(function(name) {
    return name + " = " + JSON.stringify(obj[name]);
    }).join(",\n ") + ";";
    }
    function foo() {
    eval(getVariableDeclaration({'prop1' : 'hello', 'prop2' : 123}));
    debugger;
    }
    foo();

    但是,这仅适用于非严格模式。检查§10.4.2了解详情。此外,此 hack 目前仅限于 JSON 可序列化值,如果您需要分配任意值,它会变得更加丑陋 - eval 必须在您要更改的环境中使用。

  • LexicalEnvironment,它保存当前标识符绑定(bind)(并且可能在执行期间更改 in contrast to the VariableEnvironment )。这可能不是您想要的,但可以通过 with 语句轻松修改:

    function foo() {
    with ({'prop1' : 'hello', 'prop2' : 123}) {
    debugger;
    }
    }
    foo();

    同样,它在严格模式下不起作用。参见 §12.10§10.2.2.3关于它的工作原理和影响其他绑定(bind)。

如您所见,严格模式禁止对(非全局)执行上下文进行任何更改,因为这会使绑定(bind)成为非静态和不可优化的。大多数代码也变得更难理解,因此这通常被认为是一种不好的做法。

从学术 Angular (理解语言的工作原理)考虑这些 hack 是很好的,但你永远不应该在生产中使用它们。无论您有什么想法需要此类技术,总有更好的解决方案。

关于javascript - 如何在 JavaScript 中动态地向当前执行上下文添加属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19127277/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com