到目前爲止,我只看到封閉在javascript:c/C++/java/PHP有關閉嗎?
var name=...;
$(..).onclick(function() {
//here I can reference to name
});
此功能是否會在c/c++/java/PHP
存在嗎?
如果存在,一個Hello World示例可用?
到目前爲止,我只看到封閉在javascript:c/C++/java/PHP有關閉嗎?
var name=...;
$(..).onclick(function() {
//here I can reference to name
});
此功能是否會在c/c++/java/PHP
存在嗎?
如果存在,一個Hello World示例可用?
http://en.wikipedia.org/wiki/Closure_%28computer_science%29#PHP
對於PHP
<?php
$greet = function($name)
{
printf("Hello %s\r\n", $name);
};
$greet('World');
$greet('PHP');
?>
PHP有這些呢,因爲5.3。它們不那麼靈活(因爲你不能使用$this
),但仍然非常有用。
Lisp和它的方言也有倒閉。
C中沒有,因爲功能不是第一類對象。
C++不還,但它確實與即將標準(通常被稱作的C++ 0x)中,用所謂的lambda表達式:
std::string name;
auto mylambda = [&](){ std::cout << name; };
// ^automatically reference all objects in the enclosing scope.
第一類對象是什麼意思? – 2011-05-28 12:09:37
@ compile-fan:這意味着你不能創建它們*就像你可以創建一個'int'或'struct'一樣。函數在編譯時必須全部知道。 – Xeo 2011-05-28 13:40:24
對於C,它們可以作爲一個非標準擴展稱爲blocks。
在一個點上,關閉(Lambda項目)將要成爲Java 7的一部分,但他們目前列爲"Deferred to Java 8 or later"。
至於PHP中,你可以啓用關閉的方法是這樣的內部訪問特定的變量:
$xVar = "var";
$closure = function() use ($xVar) {
echo $xVar;
}
$closure();
而且它也可以改變關閉內部的變量:
$xVar = "var";
$closure = function($newVar) use (&$xVar) {
$xVar = $newVar;
}
$closure("new var content");
你的榜樣並不完全是[封閉](http://en.wikipedia.org/wiki/Closure_ \(computer_science \))。 – Gumbo 2011-05-28 12:07:29
你在說什麼叫做lambda函數。關閉意味着別的東西。 – missingfaktor 2011-05-28 12:12:23
@Gumbo,看起來像一個封閉給我。雖然匿名函數確實關閉了範圍,包括'name'就像OP所描述的那樣,'onclick'位是無關緊要的。你的爭吵是什麼? – davin 2011-05-28 14:41:10