在闭包内部分配变量 javascript

Assigning variable inside of closure javascript

我有闭包函数,我试图在其中传递实际变量,然后在闭包函数内部执行某些操作后,我希望将闭包函数的结果分配给我在函数中传递的变量。

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

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 = "whatever the result is in loadingAssetFile" ,bar = "whatever the result is in loadingAssetFile" 等等

我怎样才能做到这一点?

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

当你传递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;
    }

}

编辑: 使用对象可能比使用数组更好,我只是想展示另一种方法并更详细地解释重新分配参数.

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

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 允许您使用字符串作为索引(有点...),您可以这样做:

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;
    }
}