-
闭包与函数:从零到一的抖音运营变现全攻略
资源介绍
甴田 第五章 函数与闭包
以,从公开的 畁畐畉 定义中,是不存在函数原型这一数据类型的。它只存在于实现中,但和字符串、表这些数
据类型一样,参于垃圾回收的过程。
由 function foobar ()
甲 return load[[
申 return "Hello"
甴 ]]
电 end
这段代码看似会得到和前面提到的代码相同的结果:每次调用 畦畯畯畢畡畲 都会生成一个返回 畈略畬畬畯 字符串的
函数。但实际上却有所区别。 畬畯畡畤 不仅仅有编译代码的成本,而且每次会产生一个新的函数原型;而直接返
回一个函数对象,无论是否需要绑定 畵異當畡畬畵略 ,都会复用同一个函数原型。
生成函数原型有两个途径:其一是由源代码编译而来,其二可以从编译好的字节码加载得到。这些都不
在本章节细述,我们仅讨论把函数原型和 畵異當畡畬畵略 绑定在一起得到闭包的过程。
畐畲畯畴畯 是一种 畇畃畏畢番略畣畴 ,它的结构定义在 畬畯畢番略畣畴甮畨 中。它的类型为 界畕畁 畔畐畒畏畔畏 ,由于这并不是
一个公开类型,最终用户无法得到一个 畐畲畯畴畯 对象,所以 界畕畁 畔畐畒畏畔畏 没有定义在 畬畵畡甮畨 中,而存在于
畬畯畢番略畣畴甮畨。
由 #define LUA_TPROTO LUA_NUMTAGS
源代码 电甮由町 畬畯畢番略畣畴甮畨町 畐畲畯畴畯
甴男田 typedef struct Proto {
甴男由 CommonHeader;
甴男甲 TValue *k; /* constants used by the function */
甴男申 Instruction *code;
甴男甴 struct Proto **p; /* functions defined inside the function */
甴男电 int *lineinfo; /* map from opcodes to source lines (debug information)
*/
甴男甶 LocVar *locvars; /* information about local variables (debug information
) */
甴男男 Upvaldesc *upvalues; /* upvalue information */
甴男甸 union Closure *cache; /* last created closure with this prototype */
甴男甹 TString *source; /* used for debug information */
甴甸田 int sizeupvalues; /* size of ’upvalues ’ */
甴甸由 int sizek; /* size of ‘k’ */
甴甸甲 int sizecode;
甴甸申 int sizelineinfo;
甴甸甴 int sizep; /* size of ‘p’ */
甴甸电 int sizelocvars;
甴甸甶 int linedefined;
甴甸男 int lastlinedefined;
甴甸甸 GCObject *gclist;
甴甸甹 lu_byte numparams; /* number of fixed parameters */