2011-05-28 25 views
0

到目前爲止,我只看到封閉在javascript:c/C++/java/PHP有關閉嗎?

var name=...; 

$(..).onclick(function() { 
    //here I can reference to name 
}); 

此功能是否會在c/c++/java/PHP存在嗎?

如果存在,一個Hello World示例可用?

+0

你的榜樣並不完全是[封閉](http://en.wikipedia.org/wiki/Closure_ \(computer_science \))。 – Gumbo 2011-05-28 12:07:29

+0

你在說什麼叫做lambda函數。關閉意味着別的東西。 – missingfaktor 2011-05-28 12:12:23

+0

@Gumbo,看起來像一個封閉給我。雖然匿名函數確實關閉了範圍,包括'name'就像OP所描述的那樣,'onclick'位是無關緊要的。你的爭吵是什麼? – davin 2011-05-28 14:41:10

回答

0

PHP有這些呢,因爲5.3。它們不那麼靈活(因爲你不能使用$this),但仍然非常有用。

Lisp和它的方言也有倒閉。

1

C中沒有,因爲功能不是第一類對象。
C++不,但它確實與即將標準(通常被稱作的C++ 0x)中,用所謂的lambda表達式:

std::string name; 
auto mylambda = [&](){ std::cout << name; }; 
//    ^automatically reference all objects in the enclosing scope. 
+0

第一類對象是什麼意思? – 2011-05-28 12:09:37

+0

@ compile-fan:這意味着你不能創建它們*就像你可以創建一個'int'或'struct'一樣。函數在編譯時必須全部知道。 – Xeo 2011-05-28 13:40:24

2

至於PHP中,你可以啓用關閉的方法是這樣的內部訪問特定的變量:

$xVar = "var"; 

$closure = function() use ($xVar) { 
    echo $xVar; 
} 

$closure(); 

而且它也可以改變關閉內部的變量:

$xVar = "var"; 

$closure = function($newVar) use (&$xVar) { 
    $xVar = $newVar; 
} 

$closure("new var content");