我有闭包函数,其中我试图传递实际变量,然后在闭包函数内部做一些事情后,我希望将闭包函数的结果赋给我在函数中传递的变量。
我可能听起来很愚蠢只看这个例子。
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
是库的一部分,它加载传递的声音并返回加载的声音值。
答案 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;
}
}