gpt4 book ai didi

javascript - 如何从堆栈顶部执行 JS 函数?

转载 作者:行者123 更新时间:2023-11-29 10:24:59 25 4
gpt4 key购买 nike

我想从栈顶执行一个函数。也就是说,任何用“var”定义的变量都应该在全局意义上定义。这可能吗? fn.call(window) 不起作用。

<script>
var foo = "I am top level foo.";

var fn = function(){
var foo = "Setting foo from in a function";
}

fn.call(window); //doesn't work, var is still set locally in fn.
alert(foo); //desired effect will alert "setting foo from in a function"
</script>

请注意:我完全知道不指定“var”会使项目成为全局变量。问题是我不能指定“fn”的内容,它是用户定义的,但期望从顶层运行。

如有必要,我愿意使用 eval。

最佳答案

我不确定您要做什么,但您不能覆盖 foo 的值那样。当您指定 var foo在全局上下文中,它附加到全局对象(在全局范围内)。

当您指定 var foo 时在您的函数中,您在该函数的范围内声明了它。这意味着它不为外界所知+。你可以做的是这样的:

var fn = function() {
this.foo = "Setting foo from in a function";
};

或者更明确地说:

var fn = function() {
window.foo = "Setting foo from in a function";
};

这是你想要的吗?

+ 当你定义了 foo在函数内部,它附加到Activation 对象 而不是Global 对象。每次您进入函数的执行上下文时,都会创建一个新的Activation 对象。所以每次你调用这个函数,你都会得到一个新的 foo .这也很好,否则您将无法创建函数范围内的局部变量;它们会泄漏到全局范围内。

更新

如果您真的想在全局上下文中评估函数内部的代码,我想您可以执行类似以下的操作。这很丑陋,我不确定你为什么要这样做,但这里是:

var foo = 2;

var fn = function() {
var foo = 3;
}

console.log(foo); //prints 2

var fnSource = fn.toSource();
eval(fnSource.replace(/^\(function\s*\(\)\s*{/, "").replace(/}\s*\)$/, ""));

console.log(foo); //prints 3

这将去掉 (function () {})这样你最终只得到中间的代码,然后你通过 eval 运行它.

再次强调,我不建议这样做。

关于javascript - 如何从堆栈顶部执行 JS 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3562623/

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