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
`)
|
如果你只是对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
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
|
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 的对象类型
1
|
func (self
Object
) Call(name string, argumentList ...
interface
{}) (Value, error)
|
调用对象的方法
本质上等同与
1
2
|
var
method, _ := object.Get(name)
method.Call(object, argumentList...)
|
1
|
func (self
Object
) Class() string
|
Class 将会返回对象的类型,一下的一种
Object
Function
Array
String
Number
Boolean
Date
RegExp
1
|
func (self
Object
) Get(name string) (Value, error)
|
获得给定名字的属性
1
|
func (self
Object
) Keys() []string
|
获得对象的键,等同于在对象上调用 Object.keys