回调参数绑定,将局部变量变成回调的传参

本文介绍在Cocos2d-x项目中如何通过回调函数传递参数,并给出具体示例。主要讲解如何利用std::bind绑定参数到CallFunc节点,实现精灵动作结束后的释放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做项目的时候,总是会碰到在一些回调里处理逻辑,有的时候,需要一些参数来进行对应操作。

如下,我创建一个精灵,让他执行一段移动的动作,在动作结束后,我想要将这个精灵释放掉

Sprite * cardSp = Sprite::create("ui/icGotPoker.png");
cardSp->setPosition(beginPos);
cardSp->setRotation(angel - 90);
this->addChild(cardSp);

//std::bind将上面创建的cardSp绑定给GameLayer::playDealActionCallFunc的参数,这样,就可以在GameLayer::playDealActionCallFunc里以传入参数的方式拿到cardSp

MoveTo * moveTo = MoveTo::create(0.1f, endPos);
CallFunc * func = CallFunc::create(std::bind(&GameLayer::playDealActionCallFunc, this, cardSp));
Sequence * seq = Sequence::create(moveTo, func, NULL);
cardSp->runAction(seq);




//下面是他的回调


void GameLayer::playDealActionCallFunc(Node * cardSp)
{ 
    ...
    ... 
    cardSp->removeFromParent();
}





                
在 JavaScript 中,回调函数是一种非常常见且重要的模式。所谓回调函数,是指把某一个函数作为参数传递给另一个函数,在特定条件下这个被传入的函数会被调用。 当我们需要向回调函数传递额外的参数时,有几种常用的方式: --- ### 1. **通过闭包提前绑定参数** 可以使用匿名函数或者箭头函数包裹目标回调函数,并预先设定好部分参数值。这种方式利用了 JavaScript 的作用域机制(即闭包),使得可以在回调内部获得所需的外部变量。 #### 示例代码: ```javascript function doSomething(callback) { setTimeout(() => { callback(42); // 这里是回调函数的实际调用点 }, 1000); } // 使用闭包传递参数 doSomething(function(result) { console.log("结果:", result + 10); // 结果加了一个预设值 "10" }); ``` 在这个例子中,我们直接修改了 `result` 值来演示效果。 如果希望更动态地控制参数,则可以这样做: ```javascript function wrapper(param1, param2) { return function(valueFromCallback) { console.log(param1, valueFromCallback, param2); } } doSomething(wrapper("hello", "!")); // 输出 hello 42 ! ``` 这里展示了如何通过构造一个新的函数将更多上下文信息嵌套进实际执行环境之中。 --- ### 2. **使用 bind 方法固定 this 和前置参数** ECMAScript 标准提供了一个 `.bind()` 函数帮助开发者明确指定 `this` 指针以及若干个固定的前导实参。这样做的好处是可以让某些输入成为常量而无需每次都手动调整它们的位置。 #### 示例代码: ```javascript function myCallback(a, b, c) { console.log(this.name, a * b - c); } const context = { name: 'Math Operation' }; doSomething(myCallback.bind(context, 5, 3)); // 最终打印 Math Operation 20 (因为 5*4-0=20) ``` 上面的例子结合了对象属性引用和数学运算一起工作。 --- ### 3. **直接从外部环境中读取全局或局部共享状态** 有时并不一定非得显式地逐一手动添加所有可能需要用到的数据源;相反,可以让辅助程序去寻找那些已经存在于当前运行期的作用范围内但未声明成形参的东西。不过需要注意避免污染命名空间! #### 示例代码: ```javascript let sharedState = 9; function anotherCallback(x) { globalValueUsedHere = x / sharedState; console.log(globalValueUsedHere); } sharedState++; doSomething(anotherCallback); ``` 尽管这种方法简单方便,但是由于缺乏清晰边界容易引起难以调试的问题所以应谨慎采用。 --- 总结来说,根据实际情况选择合适的技术手段来进行回掉函数的参数管理非常重要。无论是借助于高阶函数还是语言特性都可以达到预期目的同时保持良好的可维护性和扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lin&Yi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值