var files = ['file1','file2','file3'];
function readFile(fn, callback) {
setTimeout(function() {
callback(null, 'filedata for ' + fn);
},1);
}
//test 1 do nothing
function test1() {
console.log('test1, dont use bind');
for (var i = 0; i < files.length; i++) {
readFile(files[i], function(file, error, data) {
console.log("Successfully read a file " + files[i])
});
}
}
//test 2 bind the first parameter
function test2() {
console.log('test2, bind the first paramenter');
for (var i = 0; i < files.length; i++) {
readFile(files[i], function(file, error, data) {
console.log("Successfully read a file " + file)
}.bind(null, files[i]));
}
}
//bind 'this', it only going to be the window object anyway, so why not use it
function test3() {
console.log('test3, bind the this');
for (var i = 0; i < files.length; i++) {
readFile(files[i], function(error, data) {
console.log("Successfully read a file " + this)
}.bind(files[i]));
}
}
//use a function closure, luckly forEach is going to do that for us
function test4() {
console.log('test4, use a closure');
files.forEach(function (file) {
readFile(file, function(error, data) {
console.log("Successfully read a file " + file)
});
});
}
//use let
function test5() {
console.log('test5, use let instead of var');
for (let i = 0; i < files.length; i++) {
readFile(files[i], function(error, data) {
console.log("Successfully read a file " + files[i])
});
}
}
//create proxy function
function proxy_readFile(fn, cb) {
return readFile(fn, function (error, data) {
cb(error, data, fn) });
}
function test6() {
console.log('test6, use a proxy function');
for (var i = 0; i < files.length; i++) {
proxy_readFile(files[i], function(error, data, file) {
console.log("Successfully read a file " + file)
});
}
}
setTimeout(test1,100);
setTimeout(test2,200);
setTimeout(test3,300);
setTimeout(test4,400);
setTimeout(test5,500);
setTimeout(test6,600);
爲什麼不使用一個IIFE關閉變量? – adeneo
'我不知道如何使它成爲最後一個參數,謝謝' - 簡單,你不能 –
爲什麼在該代碼中不能定義'files [i]'? – adeneo