2012-04-25 14 views
1

在PHP中,如果您想訪問外部範圍中的變量,則需要明確聲明它,例如,在關閉中使用PHP的顯式變量的優點

$foo = 'bar'; 
func (function() use ($foo) { 

    echo $foo; 

}); 

但是在JavaScript中,它們是隱含的,例如,

foo = 'bar'; 
func (function() { 
    console.log(foo); 
}); 

這兩種封閉的優點和缺點是什麼?

+0

因爲JavaScript基於範圍而不是類擴展/接口和東西。這是一個biiig主題,您應該考慮向Google詢問更多關於 – 2012-04-25 16:20:52

回答

2

在PHP中,如果你想在外部範圍訪問的變量,你需要 明確聲明它[...]

從技術上講,你的功能是不是在外部訪問$foo範圍。爲此,您需要:

​​

這不是關閉。 沒有變量與功能關閉。如果$foo值改變,以func下次調用將反映:

$func(); // bar 
$foo = 'baz'; 
$func(); // baz 

但是,如果我們關閉$foofunc

$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 

什麼這兩種封閉的優點和缺點?

使用「堆」類型作用域,而不是堆棧,以便變量環境保持連接到該函數允許第一類函數更靈活,因爲它們可以傳遞和回想,而不用擔心創建(或傳入)一組變量以使該功能可用。

+0

快速查詢:兩次.js返回func'bar'的唯一原因是getFunc在聲明的變量被賦予不同的值之前被調用?該值已傳入(在'func = getFunc(foo);'中聲明)並且該值在更改之前執行了腳本? – Malovich 2012-04-25 16:51:41

+0

@Movovich:正確。這就是關閉如何工作。 – webbiedave 2012-04-25 16:53:47

+1

+1優秀的答案! – Niko 2012-04-25 17:02:14

0

PHP這樣做是因爲它不知道否則你是否打算使用外部變量,因爲unset變量就像一個空字符串。因此,這種封閉類型是PHP所必需的,但不適用於Javascript。