2014-10-18 33 views
0

我有一個關於JavaScript的非常基本的問題。 考慮下面的代碼:在JavaScript中如何傳遞參數(這本身就是一個參數)

var numbers = [4,2,3,4,5,4,3,2,1]; 
var everyResult = numbers.every(function(item,index,array) { 
    alert(arguments.length); 
    return (item > 1); 
}); 

現在在上面的代碼我傳遞匿名函數爲「每一個」函數的參數。 我的匿名函數究竟如何得到正好3個參數(item,index,array)。

+0

也許在https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every的填充工具可以給你一個線索? – KooiInc 2014-10-18 13:02:16

回答

0

這是不是一個真正的基本的JavaScript問題,而是一個圖書館的問題,以及如何「發生的」依賴於實現。

在這裏,這是every在JavaScript的實現:

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

你會這樣稱呼它:

every([1,2,3,4], function(item, index, array) { 
    // do stuff 
}); 

正如你可以看到,它的every函數本身,調用fn(這是你傳入的函數),並決定傳遞哪些參數。

0

您傳遞的匿名函數只是作爲每次調用它的every()方法的參數提供。 every()遍歷列表項並每次使用三個參數調用匿名函數:value,index和整個數組。

這裏的實際每()函數是如何工作的大致源代碼:

Array.prototype.every = function(callback) { 
    for(i=0; i<this.length; i++) { 
     callback(this[i], i, this); 
    } 
} 
+0

你可能不應該把一個方法附加到'Object',它預計'this.length'是合理的。 – Alxandr 2014-10-18 13:07:14

+0

@Alxandr同意。這只是一個演示。 – 2014-10-18 13:08:02

+0

是的,我明白了,但爲什麼不直接使用'Array.prototype.every'呢? – Alxandr 2014-10-18 13:10:29

0

讓我們建立一個簡單的函數有回調參數:

function foo(callback) 
{ 
    var callbackArgument = 'bar'; 
    callback(callbackArgument); 
} 

讓我們使用它:

foo(function(arg){ 
    console.log(arg); 
}); // logs "bar" to the console! 
0

究竟如何,我的匿名功能越來越完全相同3個 參數(項指標,數組)?

也許這將是更容易使用的替代例子就明白了你:

var numbers = [4,2,3,4,5,4,3,2,1]; 
var everyResult = numbers.every(function(item,index,array) { 
alert(arguments.length); 
return (item > 1); 
}); 

你也可以寫同樣的方式如下:

var numbers = [4,2,3,4,5,4,3,2,1]; 
var everyResult = numbers.every(item,index,array) { 

function anonymous(firstVar,secondVar,thirdVar){ 

//do your anonymous stuff here 
alert(thirdVar.length); 
return (firstVar > 1); 

} 

//get the anonymous function processed data 
var anonymousFunctionResults = anonymous(item,index,array); 

//do your original stuff that you would have done with the results of anonymous function 
anonymousFunctionResults... 
} 
}); 

或者這樣:

function anonymous(firstVar,secondVar,thirdVar){ 

//do your anonymous stuff here 
alert(thirdVar.length); 
return (firstVar > 1); 

} 

var numbers = [4,2,3,4,5,4,3,2,1]; 
var everyResult = numbers.every(item,index,array, anonymous) { 

//get the anonymous function processed data 
var anonymousFunctionResults = anonymous(item,index,array); 

//do your original stuff that you would have done with the results of anonymous function 
anonymousFunctionResults... 
} 
}); 

或以這種方式:

function anonymous(firstVar,secondVar,thirdVar){ 

//do your anonymous stuff here 
alert(thirdVar.length); 
return (firstVar > 1); 

} 

var numbers = [4,2,3,4,5,4,3,2,1]; 
var everyResult = numbers.every(anonymous(item,index,array)) { 

//get the anonymous function processed data 
//you can use the "firstParameter" variable already of course 
//this is just to make a point 
var anonymousFunctionResults = firstParameter; 

//do your original stuff that you would have done with the results of anonymous function 
anonymousFunctionResults... 
} 
}); 

如果我明白你的問題很好:)