golang-otto JS解释器

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 =  2 2 ;
     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" )
if err != 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 ())
     return otto.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)
     return result
})

在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.14159 0 ) {
             console.log( "Hello, World." );
             return ;
         }
 
         var xyzzy =  NaN ;
         console.log( "Nothing happens." );
         return xyzzy;
     })();
`
 
// 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
func (err Error)  
          String 
          () string 
         

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

1
2
3
TypeError:  'def' is not a  function
     at xyz (: 3 : 9 )
     at : 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  Object struct {
}

Object代表JavaScript 的对象类型

func (Object) Call

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

调用对象的方法

本质上等同与

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

func (Object) Class

1
func (self  Object ) Class() string

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

Object
Function
Array
String
Number
Boolean
Date
RegExp

func (Object) Get

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

获得给定名字的属性

func (Object) Keys

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

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

你可能感兴趣的:(GO学习之路)