草庐IT

javascript - 属于单个隔离的多个 V8 上下文对象之间的共享/离散是什么?

我理解v8::Isolate的概念,并且我理解运行的所有内容都在与隔离关联的v8::Context中运行。与不同isolate关联的上下文不能共享任何内容。我的问题是,在单个隔离中有多个上下文是什么意思?上下文之间共享什么?它们之间有什么离散的?你什么时候可以在一个中制作一些东西并在另一个中使用它?通常在API中,如果某些东西在创建它时采用隔离或上下文,这似乎几乎是任意的。此外,欢迎就单个隔离中的多个上下文的用例提出任何建议,以帮助我开始更好地理解它们。我看到这个问题:Whatexactlyisthedifferencebetweenv8::Isolateandv8::Context?

javascript - 操纵 V8 ast

我打算直接在v8代码中实现一个js代码覆盖。我最初的目标是为抽象语法树中的每个语句添加一个简单的打印。我看到有一个AstVisitor类,它允许您遍历AST。所以我的问题是如何在访问者当前访问的语句之后向AST添加语句? 最佳答案 好的,我将总结我的实验。首先,我写的内容适用于V8,因为它在Chromium版本r157275中使用,因此可能不再有效-但我仍然会链接到当前版本中的位置。如前所述,您需要自己的AST访问者,例如MyAstVisior,它继承自AstVisitor并且必须实现一堆VisitXYZ那里的方法。唯一需要检测/检

V8 上的 JavaScript 测试

functionadd(x,y){returnx+y;}console.time("time1");for(vari=0;i结果是:时间1:1481毫秒,time2:102ms,我在nodejs上运行这个测试,但我不知道为什么第一个测试比第二个慢。 最佳答案 这是因为参数类型更改导致引擎盖下发生了去优化。要知道这一点,我们必须知道优化V8做了什么:内联这是一项重要的优化,对于性能提升至关重要。它用函数体代替函数调用以加速执行。如果一个函数的大小很小,它将被内联。这假设在函数调用中,参数是固定的。去优化V8在某些假设下进行优化。如果错

javascript - 为什么 __proto__ 未定义?

在阅读Javascript的原型(prototype)时,我遇到了这种我无法解释的行为。我正在chrome的控制台(V8)中对此进行测试。varfruit={taste:'good'};varbanana=Object.create(fruit);console.log(banana.taste);//"good"console.log(banana.__proto__);//Object{taste:"good"}console.log(Object.getPrototypeOf(banana));//Object{taste:"good"}到目前为止,一切都符合预期。但是,如果我这

javascript - 事件循环、libuv和v8引擎的关系

我正在学习Node.js的架构。我有以下问题。事件循环是libuv还是v8的一部分?事件队列是事件循环的一部分吗?事件队列是由libuv或v8引擎生成的还是事件循环本身?libuv和v8引擎有什么联系?如果事件循环是单线程的,libuv是否会创建多个线程来处理文件I/O?浏览器有事件循环机制还是只有Node.js有? 最佳答案 事件循环首先是一个高级概念,它是JavaScript编程模型的基础部分。实际上,每个V8嵌入器都需要实现一个事件循环。V8提供了一个默认实现,嵌入器可以替换或扩展它。我不明白这个问题。(我猜答案是"is",但

javascript - 为什么 V8 不能优化 try-catch-finally?

为什么V8无法优化try-catch-finallyblock,而其他著名的运行时(SpiderMonkey、Chakra)似乎对此没有问题? 最佳答案 除了问题的优先级相对较低外,没有特别的原因。这会在某个时候进行优化看看这个chromiumv8issue1065如果您以v8为目标,您可以将try-catch移动到单独的函数,但只有当它是一个真正的性能问题时才应该这样做,否则它只是过早的优化。"Programmerswasteenormousamountsoftimethinkingabout,orworryingabout,th

javascript - 在 Chrome V8 中实例化从 Object 扩展的类时,super() 不传递参数

下面的代码在ChromeV8中记录false但在Babel中记录true。feedbackfromGoogle说loggingfalse是应该的,而loggingtrue是Babel的一个错误。我查看了ES6规范,但仍然无法理解其背后的机制。任何想法将不胜感激!classNewObjextendsObject{constructor(){super(...arguments);//InV8,afterarguments===[{attr:true}]//ispassedasparametertosuper(),//this===NewObj{}inV8;//butthis===NewO

javascript - 如何在 Nodejs 中模拟 "window"对象?

在浏览器中运行时,所有附加到“window”对象的东西都会自动成为全局对象。如何创建类似于Nodejs中的对象?mySpecialObject.foo=9;varf=function(){console.log(foo);};f();//Thisshouldprint"9"toconsole 最佳答案 您可以为此目的使用预定义对象global。如果您将foo定义为global对象的属性,它将在之后使用的所有模块中可用。例如,在app.js中:varhttp=require('http');varfoo=require('./foo'

javascript - Chrome 开发者工具中 JavaScript 的奇怪行为

最近,在开发者工具中使用JavaScript时,我发现了一个奇怪的功能。Chrome接受带运算符(加号、减号)的左括号和带右括号的运算符之间的任何代码并执行它,如下所示:我没有在其他浏览器中发现这种行为,只是在Chrome中。也许这是一个特性,但为什么以及如何工作,它会不会是JavaScript引擎的问题? 最佳答案 这是chrome评估您的输入的方式:with(typeof__commandLineAPI!=='undefined'?__commandLineAPI:{__proto__:null}){//yourcodehere

javascript - 在 v8 和 Node.js 中保存函数回调

您如何将javascript提供的回调保存在v8包装对象中,以供将来不仅在当前函数调用中使用。本质上,我想在C++中创建一个javascript对象,并在使用newObject()创建时提供一个函数回调。然后在整个C++对象生命周期中使用该回调。请参见下面的示例:我遇到的问题是,当我尝试在不同的静态函数中使用Handle对象时,它会出现段错误。在Nodejs文件中:varObject=require("./customModule");varobj=newObject(function(){console.log("Callbackcalled...")})//Emitcallback