JS 函数构造函数每次都要重新解析?

2024-04-19

在 MDN 中,关于功能及功能范围 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope#Function_constructor_vs._function_declaration_vs._function_expression,这是什么意思每次评估时都会解析?这可以通过代码观察吗?

引用部分函数构造函数、函数声明、函数表达式:

由函数表达式和函数声明定义的函数是仅解析一次,而那些由 Function 构造函数定义的are not。也就是说,传递给 Function 构造函数的函数体字符串必须是每次评估时都会解析。虽然函数表达式每次都会创建一个闭包,但函数体是没有重新解析,因此函数表达式仍然比“new Function(...)”更快。因此,应尽可能避免使用 Function 构造函数。

但是,应该注意的是,函数表达式和函数声明嵌套在通过解析 Function 构造函数的字符串生成的函数中不被重复解析。例如:

var foo = (new Function("var bar = \'FOO!\';\nreturn(function() {\n\talert(bar);\n});"))();
foo(); //The segment "function() {\n\talert(bar);\n}" of the function body string is not re-parsed.

我编写了一个代码片段来(尝试)测试并理解它:

var bar = 'FOO!';
var foo = (new Function("return(function() {\n\talert(bar);\n});"))();
bar = 'FOO! again';
foo(); //The segment "function() {\n\talert(bar);\n}" of the function body string is not re-parsed.

var bar2 = 'FOO!2';
var foo2 = function() { alert(bar2); };
bar2 = 'FOO!2 again';
foo2();

两者都提醒“再次版本”。

这是什么意思reparsed or not?

可以通过代码结果来说明吗?

Thanks.


仅供参考,我尝试了另一个代码片段:

var bar = 'FOO!';
var string1 = "return(function() {\n\talert(bar);\n});";
var foo = (new Function(string1))();
bar = 'FOO! again';
foo(); //The segment "function() {\n\talert(bar);\n}" of the function body string is not re-parsed.
string1 = "return(function() {\n\talert(bar + ' more');\n});";
foo();

两者都发出“FOO!再次”警报,not“FOO!又来了”。


他们想要强调的是,JS 解析器每次都需要工作。Function构造函数被调用——基本上就是显而易见的。不涉及对传递的代码字符串的缓存。

这[仅]与闭包相比才相关。假设我们有这两个函数:

function makeAlerterParse(string) {
    return Function("alert("+JSON.stringify(string)+");");
}
function makeAlerterClosure(string) {
    return function alerter() { alert(string); };
}

加载脚本时将解析两个函数声明 - 毫不奇怪。然而,在关闭中也alerter函数表达式已经被解析。让我们制作一些警报器:

var alerter1 = makeAlerterParser("1"); // Here the parser will be invoked
alerter1(); // no parsing, the function is instantiated already and 
alerter1(); // can be interpreted again and again.

var alerter2 = makeAlerterClosure("2"); // Here, no parser invocation -
alerter2(); // it's just a closure whose code was already known
alerter2(); // but that has now a special scope containing the "2" string

还是没有惊喜吗?好,那么你已经明白了一切。警告只是像这样的显式调用

for (var fnarr=[], i=0; i<100; i++)
    fnarr[i] = makeAlerterParse(i);

实际上将调用 JS 解析器 100 次,而闭包版本是免费的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JS 函数构造函数每次都要重新解析? 的相关文章

  • 使用 preg_split 分割和弦和单词

    我正在编写一小段播放处理歌曲标签的代码 但我遇到了一个问题 我需要解析每首歌曲选项卡行并将其拆分以获取大块chords一方面 并 且words在另一个 每个块就像 line chunk array 0 gt part of line con
  • 我可以将 RegExp 和 Function 存储在 JSON 中吗?

    给定一个像这样的块 var foo regexp http fun function 将其存储在 JSON 中的正确方法是什么 您必须将 RegExp 作为字符串存储在 JSON 对象中 然后您可以从字符串构造一个 RegExp 对象 JS
  • 为什么 selenium chromedriver 使用的资源比常规 chrome 少

    我注意到 当通过 selenium chromedriver 使用新的用户数据目录启动 chrome 时 它 使用的资源 cpu 内存和磁盘 比正常启动时要少得多 我能够找到的原因之一是 selenium chromedriver 启动时带
  • IIFE 和 call 的区别

    之间有区别吗 function call this and function or var MODULE function this hello world call MODULE and var MODULE function m m h
  • 转义双引号 JavaScript

    我试图在 iPhone 上查看时运行某种图像格式 在其他情况下运行一些 Flash 视频 var uagent navigator userAgent toLowerCase if uagent search iphone gt 1 doc
  • 保护客户端 API 的安全

    我正在为基于 JavaScript 的游戏构建服务器端 API 和客户端库 其中必须确保两个非常重要的功能的安全 用户每次游玩都必须扣款 我们必须确保提交的分数是玩家实际获得的分数 解决第一个问题看起来很简单 在每次游戏开始时 我们都会调用
  • jquery $('id').text 带粗体

    我有一个 jquery 可以更改链接的文本 如下所示 if urlfind gt 0 linkurl text More info 和 HTML a href a 我试图为此链接添加粗体 但添加 b More Info b 让它们在文本本身
  • 如何修复 Eslint 错误“prefer-destructuring”?

    我想像这样缩短 ES6 中的对象文字 const loc this props local 原因是loc foo 比打字容易得多this props local foo 但现在 ESLint 抱怨道 使用对象解构 prefer destru
  • PostgreSQL:存在与左连接

    我多次听说 postgres 处理exists查询速度更快左连接 http archives postgresql org pgsql performance 2002 12 msg00185 php http archives postg
  • 如果我想让我的网站跨平台兼容和屏幕阅读器兼容,我应该避免使用 javascript 、 jquery 、 flash 、 ajax 、 silverlight 吗?

    如果我想让我的网站跨平台兼容 PC iPHONE 其他手机 PDA 和 Accessible 兼容屏幕阅读器 我是否应该避免使用 JavaScript jQuery flash Ajax Silverlight 我应该只使用 xhtml c
  • 如何将对象传递给 onclick 事件[重复]

    这个问题在这里已经有答案了 可能的重复 Javascript 循环内的事件处理程序 需要闭包吗 https stackoverflow com questions 341723 event handlers inside a javascr
  • javascript 中的类和类名有什么区别?

    为了找到某个类名的子对象 我必须创建自己的辅助函数 findChildrenByTagName function obj name var ret for var k in obj children if obj children k cl
  • 如何将java数组列表转换为javascript数组? [复制]

    这个问题在这里已经有答案了 我们如何将 String 对象的 java arraylist 转换为 javascript 数组 这就是我正在做的事情 但我正在寻找更好的方法来做到这一点 我不想迭代数组列表 var myArray
  • 根据用户投票移动 div

    我是新来的 但我喜欢这个网站 我检查了其他类似的问题 但没有看到我要找的东西 我是一名音乐家 有一段时间我一直在做 每日之歌 每天写一首小歌 我想将歌曲发布为 div 在里面 li 在 div 中 我只想要一个简单的 mp3 播放器和一个
  • 防止IndexedDB请求错误取消事务

    我的意图 循环localStorage并将数据放入IndexedDB 如果发生某些已知错误 例如当键已存在时出现 ConstraintError 我想忽略这些特定错误 以便事务不会中止 当请求触发错误时 中止事务是默认行为 问题 我以为使用
  • 如何以编程方式移动 OpenLayers Vector?

    API 文档为OpenLayers Feature Vector http dev openlayers org apidocs files OpenLayers Feature Vector js html说 Vector 本身根本没有方
  • 定位分离的 DOM 树内存泄漏

    我在诊断主要使用 Knockout 构建的非常大的单页 Web 应用程序中的分离 DOM 树内存泄漏时遇到问题 我已经调整了应用程序以附加一个假人FooBar对象特定的 HTML 按钮元素 当用户移动到应用程序的不同 页面 时 该元素应该被
  • 是否包括触摸事件客户端X/Y 滚动?

    我正在尝试获取相对于的触摸坐标viewport来自触摸事件的浏览器 例如触摸启动 我尝试从 clientX Y 属性获取它们 但两者实际上都返回包括滚动在内的值 这是违反规范的 因为它说 clientX Y 应该返回坐标而不滚动 我尝试添加
  • 不透明的回复有哪些限制?

    不透明的回应 https fetch spec whatwg org concept filtered response opaque被定义为一部分获取API https fetch spec whatwg org 并表示向远程源发出请求的
  • 如何了解来自不同...“命名空间”的变量?

    如何从外部 javascript 文件中访问在另一个地方声明的某个变量 假设在一个 html 文件中我有以下内容 在 otherfile html 的部分中 我有 alert a 我如何确保收到一条提示消息 某事 我认为Google Ads

随机推荐