2012-07-01 78 views
2

有人可以向我解釋這在JavaScript中做了什麼?在javascript中全局導入

(function (x,y){}(x,y)); 

或本

// global import 
    (function ($, YAHOO) { 
     // now have access to globals jQuery (as $) and YAHOO in this code 
    }(jQuery, YAHOO)); 

我從來沒有見過像Java或C++

回答

3

function(x, y) { }是anonoymous功能的其它語言類似的東西。

(x, y)調用該函數,傳遞xy作爲參數。

3

第二碼塊的目的是使jQuery可作爲$(不限定$全局)和在局部範圍內導入YAHOO使可變查找快一點。

除此之外,它創建一個新的作用域,所以任何用var定義的變量將不會是全局的。

通常以這種方式使用第一個代碼塊來創建新變量,例如,當你在一個循環,需要創建一個變量,回調當前i值:

for(var i = 0; i < 10; i++) { 
    (function(i) { 
     setTimeout(function() { 
      alert("number " + i); 
     }, 1000 * i); 
    })(i); 
} 

如果沒有新的領域你有相同i每次從而警報「10號」 10倍。

1

第一個調用一個匿名函數,該函數接受2個參數,並且不執行任何操作,其中xy作爲參數。

第二個做同樣的事情。它使用$作爲第一個參數名稱,並傳遞jQuery作爲參數值。因此可以在此函數內使用$來引用jQuery對象。這是一種將變量別名變爲另一個名稱的方法。

0

C#有一個類似的概念,稱爲Lambda表達式。

public static Func<int> Foo() 
{ 
    int a = 1, 
     b = 2; 

    return() => a + b; 
} 

它是一個通用的,一流的功能(通過一流的功能,它是指函數本身將返回,而不是其結果)是匿名聲明。

在這種情況下,我還會告訴你所謂的閉包 - 返回的方法包含'局部'變量a和b,允許它們在Foo超出範圍時持續存在。在許多語言中,匿名方法實施閉包。

匿名方法真的是太酷 - 您可以執行的行爲注入,在這個基準測試方法:

public static TimeSpan BenchmarkMe(Action timeThis) 
{ 
    Stopwatch sw = Stopwatch.StartNew() 
    timeThis(); 
    sw.Stop; 

    return sw.Elapsed; 
} 

你可以傳遞一個匿名函數返回一個時間跨度爲這種方法,這將爲執行基準一次反對它。漂亮,呃?