AS3函数闭包

绑定方法

绑定方法有时也叫做闭包方法,就是从它的实例提取的方法。作为参数传递给函数的方法或作为值从函数返回的方法都是绑定方法。在 ActionScript 3.0 中,新增的绑定方法类似于闭包函数,其中保留了词汇环境,即使从其实例中提取出来也是如此。绑定方法与闭包函数之间的主要不同差别是,绑定函数的 this 引用保留到实现方法的实例的链接或绑定。换句话说,绑定方法中的 this 引用总是指向实现方法的原始对象。对于闭包函数,this 引用是通用的,这意味着调用函数时,该引用指向与函数关联的任何对象。

如果使用 this 关键字,了解绑定方法就很重要。重新调用 this 关键字可提供对方法父对象的引用。大多数 ActionScript 程序员都希望 this 关键字总是引用包含方法定义的对象或类。但是,如果不使用方法绑定,并不是总是做到这样。例如,在以前版本的 ActionScript 中,this 引用并不总是引用实现方法的实例。从 ActionScript 2.0 的实例中提取方法后,不但 this 引用不绑定到原始实例,而且实例类的成员变量和方法也不可用。在 ActionScript 3.0 中不存在这样的问题,这是因为将方法当作参数传递时会自动创建绑定方法。绑定方法用于确保 this 关键字总是引用在其中定义了方法的对象或类。

下面的代码定义了名为 ThisTest 的类,该类包含一个名为 foo() 的方法(该方法定义绑定方法)和一个名为 bar() 的方法(该方法返回绑定方法)。类外部的代码创建 ThisTest 类的实例,然后调用 bar() 方法,最后将返回值存储在名为 myFunc 的变量中。

class ThisTest 
{ 
    private var num:Number = 3; 
    function foo():void // bound method defined 
    { 
        trace("foo's this: " + this); 
        trace("num: " + num); 
    } 
    function bar():Function 
    { 
        return foo; // bound method returned 
    } 
} 
 
var myTest:ThisTest = new ThisTest(); 
var myFunc:Function = myTest.bar(); 
trace(this); // output: [object global] 
myFunc(); 
/* output:  
foo's this: [object ThisTest] 
output: num: 3 */

代码的最后两行表明:虽然前一行中的 this 引用指向全局对象,但绑定方法 foo() 中的 this 引用仍然指向 ThisTest 类的实例。另外,存储在 myFunc 变量中的绑定方法仍然可以访问 ThisTest 类的成员变量。如果以上代码在 ActionScript 2.0 中运行,this 引用会匹配,但 num 变量将为 undefined

绑定方法最值得注意的一种情况是使用事件处理函数,因为 addEventListener() 方法要求将函数或方法作为参数来传递

 

 

http://www.wlrz.net/Javascript/0352088641.html

这也是篇好文章

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在 C 语言中是无法直接传递闭包的,但是可以通过使用函数指针来模拟闭包的行为。在 Rust 中,可以使用 `extern "C"` 修饰符将 Rust 函数导出为 C 函数,然后将其作为参数传递给 C 函数。 下面是一个使用原始指针传递闭包作为 C 函数参数的示例代码: ```rust // 定义一个闭包类型 type Callback = Box<dyn FnMut()>; // 将闭包转换为原始指针 fn callback_to_ptr(callback: Callback) -> *mut std::ffi::c_void { Box::into_raw(callback) as *mut std::ffi::c_void } // 将原始指针转换为闭包 unsafe fn ptr_to_callback(ptr: *mut std::ffi::c_void) -> Callback { Box::from_raw(ptr as *mut dyn FnMut()) } // C 函数,接受一个指向闭包的原始指针作为参数 extern "C" fn call_closure(ptr: *mut std::ffi::c_void) { unsafe { // 将原始指针转换为闭包 let mut callback = ptr_to_callback(ptr); // 调用闭包 callback(); // 将闭包转换回原始指针,以防止其被 Rust 的垃圾回收器释放 callback = callback_to_ptr(callback); } } fn main() { // 定义一个闭包 let mut closure = || { println!("Hello from closure!"); }; // 将闭包转换为原始指针 let ptr = callback_to_ptr(Box::new(closure)); // 调用 C 函数,并传递闭包的原始指针作为参数 unsafe { call_closure(ptr); } } ``` 在上面的示例代码中,我们首先定义了一个闭包类型 `Callback`,然后分别实现了将闭包转换为原始指针和将原始指针转换为闭包函数。接下来,我们定义了一个 C 函数 `call_closure`,它接受一个指向闭包的原始指针作为参数。在 `main` 函数中,我们定义了一个闭包,并将其转换为原始指针。然后,我们调用了 C 函数 `call_closure`,并将闭包的原始指针作为参数传递给它。在 `call_closure` 函数中,我们将原始指针转换为闭包,并调用了它。 需要注意的是,在将闭包转换为原始指针时,我们使用了 `Box::into_raw` 函数。这个函数会将 `Box` 类型的对象转换为指向堆内存的原始指针,并释放 `Box` 对象的所有权。在将原始指针转换为闭包时,我们使用了 `Box::from_raw` 函数。这个函数会将指向堆内存的原始指针转换为 `Box` 类型的对象,并获取 `Box` 对象的所有权。需要注意的是,在使用 `Box::from_raw` 函数时,必须确保传递的指针是由 `Box::into_raw` 函数产生的。否则,可能会导致内存安全问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值