先来看一段略有脑洞的js代码:
1 2 3 4 5 6 7 8
| var geek = require('GeekIt'); console.log(geek); console.log(geek()); console.log(geek()()); console.log(geek()()()); console.log(geek()()()()); console.log(geek()()()()()); console.log(geek()()()()()());
|
然后这段代码的输出:
这个helloworld真实羞涩呀,藏了6层。来看看这个具体是怎么实现的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| #include <node.h>
using namespace v8;
void MyFunction5(const FunctionCallbackInfo<Value>& args) { Isolate* isolate = Isolate::GetCurrent(); HandleScope scope(isolate); args.GetReturnValue().Set(String::NewFromUtf8(isolate, "hello world")); }
void MyFunction4(const FunctionCallbackInfo<Value>& args) { Isolate* isolate = Isolate::GetCurrent(); HandleScope scope(isolate); Local<FunctionTemplate> tpl = FunctionTemplate::New(isolate, MyFunction5); Local<Function> fn = tpl->GetFunction(); fn->SetName(String::NewFromUtf8(isolate, "MyFunction5")); args.GetReturnValue().Set(fn); }
void MyFunction3(const FunctionCallbackInfo<Value>& args) { Isolate* isolate = Isolate::GetCurrent(); HandleScope scope(isolate); Local<FunctionTemplate> tpl = FunctionTemplate::New(isolate, MyFunction4); Local<Function> fn = tpl->GetFunction(); fn->SetName(String::NewFromUtf8(isolate, "MyFunction4")); args.GetReturnValue().Set(fn); }
void MyFunction2(const FunctionCallbackInfo<Value>& args) { Isolate* isolate = Isolate::GetCurrent(); HandleScope scope(isolate); Local<FunctionTemplate> tpl = FunctionTemplate::New(isolate, MyFunction3); Local<Function> fn = tpl->GetFunction(); fn->SetName(String::NewFromUtf8(isolate, "MyFunction3")); args.GetReturnValue().Set(fn); }
void MyFunction1(const FunctionCallbackInfo<Value>& args) { Isolate* isolate = Isolate::GetCurrent(); HandleScope scope(isolate); Local<FunctionTemplate> tpl = FunctionTemplate::New(isolate, MyFunction2); Local<Function> fn = tpl->GetFunction(); fn->SetName(String::NewFromUtf8(isolate, "MyFunction2")); args.GetReturnValue().Set(fn); }
void CreateFunction(const FunctionCallbackInfo<Value>& args) { Isolate* isolate = Isolate::GetCurrent(); HandleScope scope(isolate); Local<FunctionTemplate> tpl = FunctionTemplate::New(isolate, MyFunction1); Local<Function> fn = tpl->GetFunction(); fn->SetName(String::NewFromUtf8(isolate, "MyFunction1")); args.GetReturnValue().Set(fn); }
void Init(Handle<Object> exports, Handle<Object> module) { NODE_SET_METHOD(module, "exports", CreateFunction); }
NODE_MODULE(GeekIt, Init)
|
首先模块初始化的时候把CreateFunction这个函数体作为exports对象的参数。所以在js代码中,执行geek()相当于执行了CreateFunction这个函数。在这个函数中,以MyFunction1作为返回值,所以紧接着geek()再加一对括号相当于执行了MyFunction1。以此类推,直到最后输出helloworld。