在闭包内部分配变量javascript

时间:2017-12-15 18:36:48

标签: javascript closures p5.js

我有闭包函数,其中我试图传递实际变量,然后在闭包函数内部做一些事情后,我希望将闭包函数的结果赋给我在函数中传递的变量。

我可能听起来很愚蠢只看这个例子。

var foo,bar,foobar;

    loadAsset(foo,'../assets/sounds/gameOverSound1_.mp3');
    loadAsset(bar,'../assets/sounds/gameOverSound2_.mp3');
    loadAsset(foobar,'../assets/sounds/gameOverSound3_.mp3');



    function loadAsset(varsName,cAsset){

        loadSound(cAsset,loadedAsset);

        function loadedAsset(loadingAssetFile){
                loadingCount++;
                varsName = loadingAssetFile;
            }

    }

所以基本上我需要实现foo ="无论结果是在loadingAssetFile" ,bar ="无论结果如何在loadingAssetFile"等等。

我怎样才能做到这一点?

注意:我正在使用一个名为p5.js的库来加载声音,loadSound是库的一部分,它加载传递的声音并返回加载的声音值。

2 个答案:

答案 0 :(得分:2)

当您传递foo时,会复制该值,然后将其传递给该函数。在函数内部,任何更改都不会影响外部foo变量。您需要传递引用类型,如对象,以实现您想要的结果。

您可以传递包含要更改的属性和属性名称的对象。

var obj = {
   foo: '',
   bar: '',
   foobar;
}

loadAsset(obj, 'foo', '../assets/sounds/gameOverSound1_.mp3');
loadAsset(obj, 'bar', '../assets/sounds/gameOverSound2_.mp3');
loadAsset(obj, 'foobar', '../assets/sounds/gameOverSound3_.mp3');

function loadAsset(object, varsName, cAsset){

    loadSound(cAsset, loadedAsset);

    function loadedAsset(loadingAssetFile){
         loadingCount++;
         object[varsName] = loadingAssetFile;
    }

}

答案 1 :(得分:1)

使用对象的

编辑: Suren's answer可能比使用数组更好,我只想展示一种替代方法,并详细解释重新分配参数。

重新分配参数不会更改传入值的值。

var one = 'hello';

function change(two){
   two = 'world';
}

change(one);
console.log(one); // prints 'hello'!

相反,你可以使用一个数组。类似的东西:

var assets = [];

loadAsset(0, '../assets/sounds/gameOverSound1_.mp3');
loadAsset(1, '../assets/sounds/gameOverSound2_.mp3');
loadAsset(2,'../assets/sounds/gameOverSound3_.mp3');

function loadAsset(index, cAsset){

    loadSound(cAsset,loadedAsset);

    function loadedAsset(loadingAssetFile){
      assets[index] = loadingAssetFile;
    }
}

由于JavaScript允许您使用字符串作为索引(sorta ...),您可以这样做:

var assets = [];

loadAsset('foo', '../assets/sounds/gameOverSound1_.mp3');
loadAsset('bar', '../assets/sounds/gameOverSound2_.mp3');
loadAsset('foobar','../assets/sounds/gameOverSound3_.mp3');

function loadAsset(index, cAsset){

    loadSound(cAsset,loadedAsset);

    function loadedAsset(loadingAssetFile){
      assets[index] = loadingAssetFile;
    }
}