ffi闭包函数和js函数的isJSFunction如何理解?

function test(){

console.clear()

/**函数类型是指由C语言函数指针封装成的js函数。**/

let funType = ffi.Function({

abi:"",

returnType:"int32",

parameters:["int32"]

})

/**函数与闭包的JS封装类型统一,都是FunctionValue,但值的字段类型有区别。用isJSFunction字段区分函数和闭包。**/

let fun = funType.createJsFunction((v) => 2*v)

console.log('c语言指针封装出的函数fun(3)的运行结果:' + fun(3))

console.log('是否js函数:' + fun.isJSFunction)

/**函数不能作为实参,推荐使用其指针作为实参。可以通过ToPointer()函数显式获取函数指针。**/

console.log('js函数内部指针地址为:0x' + fun.inner.ToPointer().ToBigInt().toString(16))

/**js函数传递给闭包函数时,会自动从内部取出指针**/

let closureType = ffi.Function({

abi:"",

returnType:"int32",

parameters:["pointer","int32"]

})

let closureFun = closureType.createJsFunction((fun,v) => fun(v))

console.log('闭包函数closureFun(fun,3)的运行结果:' + closureFun(fun,3))

console.log('闭包函数是否js函数:'+ closureFun.isJSFunction)

/**此处极为困惑,这里应该是创建了一个闭包函数,js函数也被提出为指针,可是检测出来的还是js函数**/

console.log('闭包函数内部指针地址为:0x' + closureFun.inner.ToPointer().ToBigInt().toString(16))

}

/**c语言指针封装出的函数fun(3)的运行结果:6

是否js函数:true

js函数内部指针地址为:0xb690010

true

闭包函数closureFun(fun,3)的运行结果:6

闭包函数是否js函数:true

闭包函数内部指针地址为:0xb690050

api抽空看了一半,看不懂,先记录下来

**/

安徽省
浏览 129
收藏
1
分享
1 +1
2
+1
全部评论 2
 
王子陶
王子陶

@金山办公

因为是用createJsFunction创建的函数对象,其被调用者是参数中的js lambda函数,所以isJSFunction为true。如果用C语言的函数指针来创建function对象,那么isJSFunction应该是false。createJsFunction函数中会动态创建一个C函数,调用新创建的C函数时ffi机制就会调用传入的js lambda函数。所以这个对象可以获取指针,其指针的作用就是作为C语言程序的回调函数使用。
· 广东省
回复
Again
收到,谢谢
· 安徽省
回复