在PHP中,如果您想訪問外部範圍中的變量,則需要明確聲明它,例如,在關閉中使用PHP的顯式變量的優點
$foo = 'bar';
func (function() use ($foo) {
echo $foo;
});
但是在JavaScript中,它們是隱含的,例如,
foo = 'bar';
func (function() {
console.log(foo);
});
這兩種封閉的優點和缺點是什麼?
在PHP中,如果您想訪問外部範圍中的變量,則需要明確聲明它,例如,在關閉中使用PHP的顯式變量的優點
$foo = 'bar';
func (function() use ($foo) {
echo $foo;
});
但是在JavaScript中,它們是隱含的,例如,
foo = 'bar';
func (function() {
console.log(foo);
});
這兩種封閉的優點和缺點是什麼?
在PHP中,如果你想在外部範圍訪問的變量,你需要 明確聲明它[...]
從技術上講,你的功能是不是在外部訪問$foo
範圍。爲此,您需要:
這不是關閉。 沒有變量與功能關閉。如果$foo
值改變,以func
下次調用將反映:
$func(); // bar
$foo = 'baz';
$func(); // baz
但是,如果我們關閉$foo
與func
:
$foo = 'bar';
$func = function() use ($foo) {
echo $foo;
};
$func(); // bar
$foo = 'baz';
$func(); // bar
func
的$foo
將保留它的價值因爲它已經關閉了功能。
要做到在JavaScript中一樣,你只是一個函數中創建一個函數和一個關閉將被創建(給內部函數訪問外圍功能的範圍):
function getFunc(foo) {
return function() {
console.log(foo);
};
}
foo = "bar";
func = getFunc(foo);
func(); // bar
foo = "baz";
func(); // bar
什麼這兩種封閉的優點和缺點?
使用「堆」類型作用域,而不是堆棧,以便變量環境保持連接到該函數允許第一類函數更靈活,因爲它們可以傳遞和回想,而不用擔心創建(或傳入)一組變量以使該功能可用。
快速查詢:兩次.js返回func'bar'的唯一原因是getFunc在聲明的變量被賦予不同的值之前被調用?該值已傳入(在'func = getFunc(foo);'中聲明)並且該值在更改之前執行了腳本? – Malovich 2012-04-25 16:51:41
@Movovich:正確。這就是關閉如何工作。 – webbiedave 2012-04-25 16:53:47
+1優秀的答案! – Niko 2012-04-25 17:02:14
PHP這樣做是因爲它不知道否則你是否打算使用外部變量,因爲unset變量就像一個空字符串。因此,這種封閉類型是PHP所必需的,但不適用於Javascript。
因爲JavaScript基於範圍而不是類擴展/接口和東西。這是一個biiig主題,您應該考慮向Google詢問更多關於 – 2012-04-25 16:20:52