node.js - V8引擎Function类的Call函数第一个参数什么意思?
伊谢尔伦
伊谢尔伦 2017-04-17 11:11:09
0
2
955
#define BUILDING_NODE_EXTENSION #include  using namespace v8; Handle RunCallback(const Arguments& args) { HandleScope scope; Local cb = Local::Cast(args[0]); const unsigned argc = 1; Local argv[argc] = { Local::New(String::New("hello world")) }; cb->Call(Context::GetCurrent()->Global(), argc, argv); return scope.Close(Undefined()); } void Init(Handle exports, Handle 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 recv。

求问这个参数是干吗用的?什么意思?它调用的时候为什么要用Context::GetCurrent()->Global()

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

reply all (2)
Ty80

唔,其实答案还是在源码V8.h里,1720行起。

/** * A JavaScript function object (ECMA-262, 15.3). */ class Function : public Object { public: V8EXPORT Local NewInstance() const; V8EXPORT Local NewInstance(int argc, Handle argv[]) const; V8EXPORT Local Call(Handle recv, int argc, Handle argv[]); V8EXPORT void SetName(Handle name); V8EXPORT Handle GetName() const; };
          

那么V8::Function::Call的接口和ECMA-262里的定义15.3里的[[Call]]是一致的。

注意,[[Call]](15.3.4.5.1)的定义和Function.prototype.call(15.3.4.4)的定义完全不一样的。
[[Call]]Function.prototype.call(及其他几乎所有ECMA-262中定义的Function.prototype)的实现过程中需要调用的内部方法。

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 athisvalue and a list of argumentsExtraArgs, the following steps are taken:

  1. LetboundArgsbe the value of F’s [[BoundArgs]] internal property.
  2. LetboundThisbe the value of F’s [[BoundThis]] internal property.
  3. Lettargetbe the value of F’s [[TargetFunction]] internal property.
  4. Letargsbe a new list containing the same values as the listboundArgsin the same order followed by the same values as the listExtraArgsin the same order.
  5. Return the result of calling the [[Call]] internal method oftargetprovidingboundThisas thethisvalue and providingargsas the arguments.

所以第一个参数就是执行上下文,用于确定代码执行时的this

然后LZ给的源码,其实就是把全局作用域当做this传进了Call而已,作用是在全局作用域里面调用自身(上下文中的cb)。

    洪涛

    参加 javascript, function.call(this,arg...)

      Latest Downloads
      More>
      Web Effects
      Website Source Code
      Website Materials
      Front End Template
      About us Disclaimer Sitemap
      php.cn:Public welfare online PHP training,Help PHP learners grow quickly!