我需要解析JavaScript代码并获取AST元素树.我正在尝试使用Google V8 JavaScript引擎.有人试过Google V8预分析器吗?任何代码示例?或者引用采用Google V8预处理器的开源项目?还有nayone有经验起诉预先解析的数据来实现AST吗?
看看下面的代码:
var pocket = {
cash: 1000,
showCash: function() {
return this.cash;
}
};
var thomas = {
name: "Thomas",
work: function() {
console.log('I don\'t want to, but I have to... work!');
},
cash: 5000
};
var bird = {
fly: function() {
console.log('I\'m flying!');
}
};
console.log(pocket.showCash());
thomas.showCash = pocket.showCash;
console.log(thomas.showCash());
bird.showCash = pocket.showCash;
console.log(bird.showCash());
var cash = 20;
var showCashFun = pocket.showCash;
console.log(showCashFun());
Run Code Online (Sandbox Code Playgroud)
代码非常简单,并显示引擎如何解释 this关键字.当我在chrome控制台中运行它时,我得到以下输出:
1000
5000
undefined
20
Run Code Online (Sandbox Code Playgroud)
那没关系 - 我理解这一切.但是当我在node.js控制台中运行它时,我得到:
1000
5000
undefined
undefined
Run Code Online (Sandbox Code Playgroud)
chrome和node.js都使用v8.怎么会有这样的差异? …
当我尝试用V8 运行一些JS代码(这个 + 这个)时我得到了这个错误(从两个弱点之前尝试过主,3.23.17,3.24.40,3.25.5; 3.23.0由于API不再起作用变化):
#
# Fatal error in ..\..\src\runtime.cc, line 785
# CHECK(V8::ArrayBufferAllocator() != NULL) failed
#
Run Code Online (Sandbox Code Playgroud)
许多其他JS代码已经有效,所以我想知道问题是什么.
它是在Win8上使用x64构建的.V8的构建正如官方文档中所述(使用gyp + MSVC 2012).我认为没有问题,因为它已经与大多数其他JS代码一起运行良好.
我认为V8本身可能存在问题,但不确定......
一些C++代码,但我不认为它有问题,因为它与其他JS代码一起工作正常:
#include <string>
#include <assert.h>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <boost/noncopyable.hpp>
#include <v8.h>
// Create a new isolate (completely isolated JS VM).
struct V8Isolate : boost::noncopyable {
v8::Isolate* isolate;
V8Isolate() : isolate(v8::Isolate::New()) {}
~V8Isolate() { isolate->Dispose(); }
operator v8::Isolate*() { return isolate; }
v8::Isolate* operator->() { …Run Code Online (Sandbox Code Playgroud) 我有一个本机插件,它实现了一个接受回调的函数,并调用带有可能错误和结果的回调.
我目前有来自NodeJS文档的以下代码,它直接使用结果调用该回调:
v8::Local<v8::Function> callback = v8::Local<v8::Function>::Cast(args[0]);
const unsigned callback_argc = 1;
v8::Local<v8::Value> callback_arguments[callback_argc] = { physical_drives };
callback->Call(v8::Context::GetCurrent()->Global(), callback_argc, callback_arguments);
Run Code Online (Sandbox Code Playgroud)
在某些情况下,我想用null第一个参数调用回调:
v8::Local<v8::Value> callback_arguments[callback_argc] = {
v8::Null()
physical_drives
};
Run Code Online (Sandbox Code Playgroud)
这种失败,因为我不能初始化callback_arguments用v8::Null()或v8::Undefined()那些函数返回一个v8::Primitive同时callback_arguments包含v8::Value秒.
手动演员既不可能:
v8::Local<v8::Value>::Cast(v8::Null());
Run Code Online (Sandbox Code Playgroud)
将null/ undefined值传递给回调的正确方法是什么?
是否有可能在iojs中获取模板字符串的原始版本?
var s = `foo${1+1}bar`
console.log(s); // foo2bar
Run Code Online (Sandbox Code Playgroud)
在前面的例子中,我想得到字符串: foo${1+1}bar
edit1:我需要检测一个模板字符串是否依赖于它的上下文if if只是一个可以包含CR和LF的'常量'字符串
给出这段代码时:
while(true){
...
}
Run Code Online (Sandbox Code Playgroud)
可以异步执行多少次?
我已经写了这个来测试以及它如何与Google的JavaScript V8引擎交互,并且一次只有一个while循环处于活动状态.
var cycles = 0;
var counter = new Date();
var OpsStore = [];
var threads = [];
for(var i = 0; i < 10; i++){
setTimeout(newThread(i),0);
}
function renew(){
if (secondPassed(counter, new Date())){
counter = new Date();
Ops();
}
cycles++;
}
function newThread(id){
threads.push({id: id, active: true});
return function(){
while(true){
console.log(id);
threads[id].active = true;
renew();
}
}
}
function Ops(){
OpsStore.push(cycles);
console.log(cycles, ' avg: ', getAvgOps());
console.log(threads);
cycles = 0;
for(var …Run Code Online (Sandbox Code Playgroud) 我们知道Chrome和node.js运行在相同的V8 javascript引擎上.我的理解:
所以,比较node.js的V8 javascript的简单速度测试
使用Chrome的V8
为什么node.js比Chrome慢?
顺便说一句,这是代码:
function speedTest(){
console.time("loop");
for (var i = 0; i < 1000000; i += 1){
// Do nothing
}
console.timeEnd("loop");
}
Run Code Online (Sandbox Code Playgroud) 我尝试在嵌入v8引擎的应用程序中添加检查器。
我所有的尝试都失败了,所以我尝试着看一下node.js的实现:它很繁重,所以我从v8源代码切换到了inspector-test和d8。但是我没有找到如何将其连接到chrome :(
因此,在继续开发之前,我将要在chrome和可调试应用程序(例如d8或v8_shell)之间建立调试连接,以分析其工作方式。
我的问题:如何将“ inspector-test或d8或v8_shell”连接到同一台计算机上的chrome:// inspect /#devices。
谢谢你的帮助
我是JS事件循环的新手,我想知道是否有人可以通过js引擎如何运行这个简单的步骤:
function start(){
setTimeout(function(){
console.log("Timeout")
}, 0)
setImmediate(function(){
console.log("Immediate")
})
process.nextTick(function(){
console.log("next tick")
})
}
Run Code Online (Sandbox Code Playgroud)
结果是:
next tick
Timeout
Immediate
Run Code Online (Sandbox Code Playgroud)
我想当JS引擎运行时,
我的困惑是为什么setTimeout在立即之前打印出来?
PS,
将Timeout延迟设置为0到3或更多后,顺序为:
next tick
Immediate
Timeout
Run Code Online (Sandbox Code Playgroud)
但这仍然无法解释为什么以前的订单JS事件循环运行.
我想知道我错过了什么?
v8 ×10
javascript ×8
node.js ×6
ecmascript-6 ×1
event-loop ×1
inspector ×1
performance ×1
this ×1