替代在javascript中通过引用传递

时间:2013-12-31 10:24:24

标签: javascript

我是一名学习javascript的c ++程序员。

我有一个javascript函数 loadTexture 来从URL加载图像并从中创建一个opengl纹理。它以异步方式工作并返回 Promise 对象,以便我可以判断它何时完成。一切都很好:))

但是我希望能够告诉它在哪里存储生成的opengl纹理id,就像这样 -

var catImageFuture = loadTexture("cat.png", this.catTextureId);
/* Wait for the future, and several other ones to complete before doing the next thing */

并将它生成的opengl id存储在我传入的变量中作为第二个参数。在C ++中,这很简单,我可以将引用或指向变量的指针传递给函数。但这在Javascript中是不可能的,因为它没有通过引用或指针传递。

在Javascript中实现类似目标的正确方法是什么。

3 个答案:

答案 0 :(得分:3)

JavaScript没有机制(尚未)优雅地​​内联异步代码。现在,一切都是通过回调来完成的。如果在done对象上实现Future方法,将其结果作为参数传递给回调,则可以编写:

var that = this; // You may need this, depending on how you implement Future.done

loadTexture("cat.png").done(function(result) {
    that.catTextureId = result;
});

JavaScript运行时将在几年内支持生成器,所以你很快就会写:

this.catTextureId = yield loadTexture("cat.png");

答案 1 :(得分:1)

在Javascript中你会使用一个函数。该函数将接收数据作为参数并将其存储在适当的位置。您可以使用闭包来捕获对局部变量的引用。

另一个选择是始终将数据包装在对象中。将对象传递给函数,函数可以赋值对象的属性。对象和数组像Javascript中的指针一样传递,因此当函数修改它时,它将对调用者可见。

答案 2 :(得分:1)

有几种方法:

您可以使用自定义对象并对其进行管理,例如:

var cat = new Cat();
cat.texture = new Texture();
...

或者您可以使用回调:

var TextureId;

function loadTexture(path, callback)
{
    var img = new Image(path);
    var id = (GetSomeHowId);\
    img.onload = (function(i){ return (function(){callback(i);}); })(id);
}

loadTexture("cat.png", (function(id){ TextureId = id; }));

希望你明白这一点。