gpt4 book ai didi

javascript - 麻烦评估函数定义(...在 JavaScript 中)

转载 作者:行者123 更新时间:2023-11-29 14:44:05 25 4
gpt4 key购买 nike

我正在尝试通过评估用户提供的字符串来构建一个简单的 REPL。它似乎在大多数情况下都有效,除了像“function f() {...}”这样的输入,它对 future evals 中可见的函数没有影响。玩了一会儿之后,我只能得出结论,我根本不了解 eval。下面是一个简短的片段,展示了一些神秘的行为:

var xeval = eval;

function silly() {}

eval("function good() {}");

function baffleMe() {
eval("alsoGood = function() {}");
eval("function notSoGood() {}");
xeval("function hope() {}");
xeval("function crushedHope() { silly(); }");
}

baffleMe();

good(); // Okay.
alsoGood(); // Okay.
notSoGood(); // ReferenceError: notSoGood is not defined
hope(); // Why does this even work?
crushedHope(); // ReferenceError: silly is not defined

有人可以解释这些结果吗? (可在最新的 Chrome 和 Firefox 中重现)

[编辑]

澄清一下,仅当代码在 Javascript 控制台或 JSFiddle 等工具中执行时,最后一次调用才会失败,但嵌入脚本标记时不会。对已接受答案的评论包含对此的解释。

最佳答案

我会尽力解释:

Good 是在全局范围内评估的:

good();         // Okay.

Alsogood 没有 var 定义,因此是在全局范围内定义的:

alsoGood();     // Okay.

NotSoGood 是在函数范围内定义的,因此在全局范围内不存在:

notSoGood();    // ReferenceError: notSoGood is not defined

Hope 是在全局范围内通过 eval 的闭包引用求值的,因此它是在全局范围内求值的:

hope();         // Why does this even work?

CrushedHope 和hope 一样,但是这里应该定义silly:

crushedHope();  // ReferenceError: silly is not defined

正如下面的评论中提到的,当使用 JSFiddle 和代码被 window.onload 包裹时,silly 在问题中是未定义的。

关于javascript - 麻烦评估函数定义(...在 JavaScript 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34769823/

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