golang-otto JS解释器

shuanger_ · · 9193 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

otto是一个Go语言实现的JavaScript 解释器

 

otto是一个Go语言实现的JavaScript的语法分析器和解释器

1
2
3
import(
    "github.com/robertkrimen/otto"
)

在虚拟机中运行一些代码

1
2
3
4
5
vm := otto.New()
vm.Run(`
    abc = 22;
    console.log("The value of abc is " + abc);// 4
`)

从虚拟机中获取一些值

1
2
3
value, err := vm.Get("abc")
    value, _ := value.ToInteger()
}

设置一个数字变量

1
2
3
4
5
vm.Set("def"11)
vm.Run(`
    console.log("The value of def is " + def);
    // The value of def is 11
`)

设置一个字符串变量

1
2
3
4
vm.Set("xyzzy""Nothing happens.")
vm.Run(`
    console.log(xyzzy.length);// 16
`)

活动一个语句的运行结果

1
2
3
4
5
value, _ = vm.Run("xyzzy.length")
{
    // value is an int64 with a value of 16
    value, _ := value.ToInteger()
}

一个错误发生时

1
2
3
4
5
6
value, err = vm.Run("abcdefghijlmnopqrstuvwxyz.length")
iferr != nil {
    // err = ReferenceError: abcdefghijlmnopqrstuvwxyz is not defined
    // If there is an error, then value.IsUndefined() is true
    ...
}

设置你个函数

1
2
3
4
vm.Set("sayHello", func(call otto.FunctionCall) otto.Value {
    fmt.Printf("Hello, %s.\n", call.Argument(0).String())
    returnotto.Value{}
})

设置你个带有返回值的函数

1
2
3
4
5
vm.Set("twoPlus", func(call otto.FunctionCall) otto.Value {
    right, _ := call.Argument(0).ToInteger()
    result, _ := vm.ToValue(2+ right)
    returnresult
})

在JavaScript中使用函数

1
2
3
4
5
6
result, _ = vm.Run(`
    sayHello("Xyzzy");     // Hello, Xyzzy.
    sayHello();            // Hello, undefined
 
    result = twoPlus(2.0);// 4
`)

Parser

如果你只是对AST(抽象语法树)感兴趣,你可以获得一个分离的语法解析器

http://godoc.org/github.com/robertkrimen/otto/parser

解析并返回一个AST

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
filename := ""// A filename is optional
src := `
    // Sample xyzzy example
    (function(){
        if(3.141590) {
            console.log("Hello, World.");
            return;
        }
 
        varxyzzy = NaN;
        console.log("Nothing happens.");
        returnxyzzy;
    })();
`
 
// Parse some JavaScript, yielding a *ast.Program and/or an ErrorList
program, err := parser.ParseFile(nil, filename, src, 0)

otto

你也在命令行中运行otto

1
2
$ go get-v github.com/robertkrimen/otto/otto
直接运行一段代码或运行一个源文件
1
$ otto example.js

使用

1
 

 

1
错误类型
1
2
type Error struct {
}

一个错误类型代一种运行时错误,类型错误或者引用错误

1
2
3
func (Error) Error
 
func (err Error) Error() string

错误返回错误描述

1
 

 

1
<pre>func (err Error) String() string

错误返回错误描述和在那里发生的字符串

1
2
3
TypeError: 'def'is not a function
    at xyz (<anonymous>:3:9)
    at <anonymous>:7:1/

函数调用类型

1
2
3
4
5
type FunctionCall struct {
    This         Value
    ArgumentList []Value
    Otto         *Otto
}

FunctionCall操作Javascript的函数调用

函数调用的参数

1
func (self FunctionCall) Argument(index int) Value

Argument将会返回函数参数的索引,不存在将会返回Undefined

对象类型

1
2
type Objectstruct {
}

Object代表JavaScript 的对象类型

func (Object) Call

1
func (self Object) Call(name string, argumentList ...interface{}) (Value, error)

调用对象的方法

本质上等同与

1
2
varmethod, _ := object.Get(name)
method.Call(object, argumentList...)

func (Object) Class

1
func (self Object) Class() string

Class 将会返回对象的类型,一下的一种

<code>Object
Function
Array
String
Number
Boolean
Date
RegExp
</code>

func (Object) Get

1
func (self Object) Get(name string) (Value, error)

获得给定名字的属性

func (Object) Keys

1
func (self Object) Keys() []string

获得对象的键,等同于在对象上调用 Object.keys


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:shuanger_

查看原文:golang-otto JS解释器

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:1006366459

9193 次点击  ∙  1 赞  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传