2009-12-10 61 views
13

我可以在JavaScript中以便捷的方式調用帶有參數數組的函數嗎?帶有參數數組的調用函數

例子:

var fn = function() { 
    console.log(arguments); 
} 

var args = [1,2,3]; 

fn(args); 

我需要arguments[1,2,3],就像我的數組。

回答

26

你應該使用apply

var fn = function() { 
    console.log(arguments); 
}; 

var args = [1,2,3]; 

fn.apply(null, args); 

應用將使相當於函數調用:我用null作爲apply第一個參數

fn(1,2,3); 

通知,將在this關鍵字設置爲fn內部的全局對象(window)。

你也應該知道,arguments對象是不是一個真正的數組,這是一個類似數組的對象,包含對應於被用來調用函數的參數,一個length屬性,讓你的號碼數字指標使用的參數,以及對執行函數的引用(對於匿名函數遞歸非常有用)的arguments.callee屬性。

如果你想從你的arguments對象做出一個數組,你可以使用Array.prototype.slice方法:

var fn = function() { 
    var args = Array.prototype.slice.call(arguments); 
    console.log(args); 
}; 

編輯:在回答您的意見,是的,你可以使用shift方法和設置它的返回值作爲你的函數的上下文(this關鍵字):

fn.apply(args.shift(), args); 

但請記住,shift將刪除來自原始數組的第一個元素,並且您的函數將在沒有第一個參數的情況下被調用。

如果您還需要調用函數與所有其他參數,您可以:

fn.apply(args[0], args); 

如果你不想改變的背景下,你可以簡單地提取自己的函數中的第一個參數:

var fn = function() { 
    var args = Array.prototype.slice.call(arguments), 
     firstArg = args.shift(); 

    console.log(args, firstArg); 
}; 
+0

如果我想的範圍是數組的第一個元素?我需要使用shift()來僞造它嗎? – David 2009-12-10 16:04:03

+0

@David:範圍是什麼意思? 'this'關鍵字? – CMS 2009-12-10 16:10:04

+0

是的,使用apply(),第一個參數變成函數的作用域(this),對吧?這種情況下的範圍需要是第一個數組元素。 – David 2009-12-10 16:14:05

5

在ECMAScript 6中,您可以使用spread syntax (...)來實現此目的。它比Function.prototype.apply()更簡單易懂。

代碼示例:

const fn = function() { 
    console.log(arguments); 
} 

const args = [1,2,3]; 

fn(...args);