2011-11-04 34 views
1

我有點新的JavaScript,我想我的功能採取參數和名關聯 他們,在JavaScript中創建智能參數傳遞的方法?

myFunction(width = 50, height = 20); 
myFunction(height = 20, width = 20) 
myFunction(width = 50); // height will get some default value 

這樣的話我就可以有:

function myFunction() 
    { 
    var width; // this will somehow get the variable that was passed in or set default value 
    var height; // this will somehow get the variable that was passed in or set default value 
    } 

有一種可能在JavaScript中做到這一點的方法?

而且,我見過的形式

ball: {  
     x: '124', 
     y: '22', 
     } 

的語法,但我不知道它叫什麼。

也許我可以以某種方式使用這種語法,然後創建一些對象,然後傳遞給我的函數。

但是我正在尋找的是:

  1. 參數傳遞到由名稱的函數,而不是命令。
  2. 使傳遞給函數的所有參數爲可選;如果他們沒有通過分配默認值。

什麼是最好/最乾淨的方式來做到這一點?

回答

4

傳遞一個對象作爲單個參數是要走的路。

實施例:

function func(options) { 
    var width = options.width || 0; 
    var height = options.height || 0; 
    //... 
} 

func({height: 100}); // width will be 0 as options.width is undefined 

||速記(布爾OR)將如果不提供它的每個值設置爲0。也就是說,如果options.width評估爲false,則它將分配0,這是未定義的情況(即,options.widthundefined)。

這是否足夠取決於允許哪種類型的值。例如。如果false是有效值,則必須明確測試undefined

另外,可以說是更得心應手的方式來定義的默認值是使用一個extend功能:

function extend(a, b) { 
    for(var prop in b) { 
     if(b.hasOwnProperty(prop) && !a.hasOwnProperty(prop)) { 
      a[prop] = b[prop]; 
     } 
    } 
} 

此副本對象b的所有屬性反對a,如果它們不存在。

它可以讓你設置的默認值,這樣

function func(options) { 
    extend(options, {width: 0, height: 0}); 
    // access the values with options.height and options.width 
    // options.height is not overwritten 
} 

無論價值。


這是jQuery使用的方式。它提供了一個$.extend[docs]函數,它在開發插件以提供默認設置時通常使用。接受命名參數和可選參數的函數的一個很好的例子是$.ajax[docs]

1

你可以通過一個JS對象的功能:

function myFunction(data) { 
    var width = data.width; 
    var height = data.height; 

} 

myFunction({'width':50, 'height':20}); 
+0

問題中沒有JSON。 –

+0

'ball:{x:'124',y:'22'}'看起來像JSON,我錯過了什麼? – Clive

+1

@FelixKling JSON是「此語法稱爲什麼」的答案 – ZenMaster

1

是的。您可以創建一個對象文本,並將其作爲參數傳遞給函數:

var param = { 
    x: 10, 
    y: 20 
} 

把它傳遞給你的函數:

foo(param); 

,並在你的函數代碼指的就是像這樣(例如) :

function foo(param) 
{ 
    console.log(param.x); 
    console.log(param.y); 
} 

關於你的第二個問題 - 傳遞參數的功能可選在JavaScript中 - 沒有獲得的參數通過將是undefined - 這是沒有價值,但訪問時返回undefinedparam對象的未定義屬性也相同 - 如果您未定義x - param.x將在訪問時返回undefined