2014-06-17 73 views
0

我遇到了一些我無法完全理解的代碼。原理似乎足夠清晰,但我在forEach函數調用中聲明的第二個參數有一些困難。很明顯,匿名函數通過action參數傳遞給forEach,但是一旦進入for循環,究竟是如何工作的呢?如何將匿名函數作爲參數傳遞給內部使用?

function forEach(array, action) { 
    for (var i = 0; i < array.length; i++) 
    action(array[i]); 
} 

var numbers = [1, 2, 3, 4, 5], sum = 0; 

forEach(numbers, function(number) { 
    sum += number; 
}); 

console.log(sum); // 15 

我覺得最讓我困惑的是,匿名函數的語法似乎並不兼容action(array[i]) - 我的意思是,我明白sum獲得反過來數組的每個值,但如果函數「替換」action參數,(array[i])部分如何以及在哪裏適合?

+0

我很困惑你的困惑。 'forEach'函數接受兩個參數,第二個參數需要是一個函數的引用(任何函數 - 名字,匿名,不管)......你傳遞一個匿名函數。在'forEach'函數內部,它聲明瞭'action'參數...並且由於它**應該保存對函數的引用,並且可以調用函數,所以可以調用'action'。調用'action'會調用你傳遞的第二個參數。它使用一個參數('array [i]')調用它,它可以用作你傳遞的函數中的'number'參數 – Ian

+0

@Ian - 謝謝。我知道自己有可能沒有正確地解釋自己,但你已經幫助清理了一些事情。我正在查看它,好像anon函數的整體被保存在動作變量中,而不是對它的引用。所以'(數組[i])'似乎會成功,而不是作爲它的參數。 – verism

回答

1

讓我重寫代碼以更明確的方式:

function forEach(array, action) { //1st parameter is an array, the 2nd is a function 
    for (var i = 0; i < array.length; i++) 
    action(array[i]); //The function is used, with each element of the array as parameter 
} 

var numbers = [1, 2, 3, 4, 5], sum = 0; 

var myFunction= function (number) { //I declare a function which receives a number 
    sum += number;     //and adds it to sum. 
} 

forEach(numbers,myFunction); //I call the forEach function using the 
          // variables I previously created as parameters 

console.log(sum); 
+0

這是一個這樣簡單的解釋。以這種方式看到它立即突出了我誤解中的錯誤。謝謝。 – verism

0

在javascript中,當你定義一個變量,你寫的:

var x = 0; // here you reserve an object 

當你定義一個函數,你也保留一個對象。 JavaScript的處理函數作爲對象,你可以將它分配給任何一個變量:

var x = function(number){ sum +=number; }; 
forEach (numbers, x(number)); 

約在迷茫的語法,匿名函數是在運行時動態聲明的函數。它們被稱爲匿名函數,因爲它們沒有像正常函數那樣被賦予一個名字。 所以調用一個匿名函數,你的語法規則如下:如果你想再次調用它要麼你應該重複上面的代碼或聲明的函數,而無需調用它,將它保存在變量,你可以把它叫做

// call 
function (param1, param2, ...){ 
// function body 
} 

很多次:

// declaration 
var x = function(param1, param2, ...){ 
    // body 
}; 
// call 
x(p1,p2,....); 
相關問題