执行JavaScript

执行JavaScript,javascript,Javascript,我想知道当你点击“运行”时,这个站点上的JS是如何执行的: 它不像JSFiddle,所以他没有使用iframe 我在网上搜索发现,它也执行代码。我不知道它是否也有同样的效果。有人能解释一下这个神奇之处吗?看看源代码,他们只是在文本区域创建了一个包含代码的函数,使用函数体作为方法。然后调用函数: try { (new Function( jQuery("#code").val() ))(); } catch(e){ error(e.message); } 这与eval的工作方式

我想知道当你点击“运行”时,这个站点上的JS是如何执行的:

它不像JSFiddle,所以他没有使用iframe


我在网上搜索发现,它也执行代码。我不知道它是否也有同样的效果。有人能解释一下这个神奇之处吗?

看看源代码,他们只是在文本区域创建了一个包含代码的函数,使用函数体作为方法。然后调用函数:

try {
    (new Function( jQuery("#code").val() ))();
} catch(e){
    error(e.message);
}
这与
eval
的工作方式非常相似,只是新函数无法访问当前范围内的变量,如链接中的注释所述:

注意:使用函数构造函数创建的函数不会为其创建上下文创建闭包;它们始终在全局范围内创建。运行它们时,它们将只能访问自己的局部变量和全局变量,而不能访问调用函数构造函数的作用域中的变量。这不同于将eval与函数表达式的代码一起使用


当您单击
run
时,它将提交一个包含代码的
。然而,表单提交是用javascript处理的,下面的代码处理输入脚本的运行:

try {
    (new Function( jQuery("#code").val() ))();
} catch(e){
    error(e.message);
}

本质上,它是使用创建一个新函数并立即运行它。
assert
log
error
函数是页面其他地方定义的正常函数。任何错误都会被catch捕获并传递到相同的
error
函数。

您可以执行如下操作:
var script=document.createElement('script');script.text='';document.head.appendChild(脚本)。在开发人员模式下研究“运行”按钮。你可以看到所有的魔力。啊,我花了太长时间写我的第二段:)@JamesThorpe:)我知道那种感觉谢谢!:)所以这就像
eval
?@gform不完全一样-请参见链接中的注释page@gform差异也包含在谢谢中,没想到这么简单。