#define BUILDING_NODE_EXTENSION
#include <node.h>
using namespace v8;
Handle<Value> RunCallback(const Arguments& args) {
HandleScope scope;
Local<Function> cb = Local<Function>::Cast(args[0]);
const unsigned argc = 1;
Local<Value> argv[argc] = { Local<Value>::New(String::New("hello world")) };
cb->Call(Context::GetCurrent()->Global(), argc, argv);
return scope.Close(Undefined());
}
void Init(Handle<Object> exports, Handle<Object> module) {
module->Set(String::NewSymbol("exports"),
FunctionTemplate::New(RunCallback)->GetFunction());
}
NODE_MODULE(addon, Init)
主要是第十二行 cb->Call(Context::GetCurrent()->Global(), argc, argv);
。
原代码在这里,然后文档里面是这么写的:
V8EXPORT Local
v8::Function::Call ( Handle< Object > recv, int argc, Handle< Value > argv[] )
第一个参数是 Handle<Object> recv
。
求问这个参数是干吗用的?什么意思?它调用的时候为什么要用 Context::GetCurrent()->Global()
?
Well, actually the answer lies in the source code V8.h, starting from line 1720.
Then the interface of
V8::Function::Call
is consistent with the[[Call]]
in definition 15.3 of ECMA-262.Note that the definition of
[[Call]]
(15.3.4.5.1) and the definition ofFunction.prototype.call
(15.3.4.4) are completely different .[[Call]]
is an internal method that needs to be called during the implementation ofFunction.prototype.call
(and almost all otherFunction.prototype
defined in ECMA-262).15.3.4.5.1 [[Call]]
When the [[Call]] internal method of a function object,
F
, which was created using the bind function is called with athis
value and a list of argumentsExtraArgs
, the following steps are taken :boundArgs
be the value of F’s [[BoundArgs]] internal property.boundThis
be the value of F’s [[BoundThis]] internal property.target
be the value of F’s [[TargetFunction]] internal property.args
be a new list containing the same values as the listboundArgs
in the same order followed by the same values as the listExtraArgs
in the same order.target
providingboundThis
as thethis
value and providingargs
as the arguments.So the first parameter is the execution context, which is used to determine
this
when the code is executed.Then the source code provided by LZ actually just passes the global scope as this into Call. The function is to call itself (cb in the context) in the global scope.
Join javascript, function.call(this,arg...)