PHPでは、外部スコープの変数にアクセスする場合は、明示的に宣言する必要があります。
$foo = 'bar';
func (function() use ($foo) {
echo $foo;
});
しかし、JavaScriptでは、それらは暗黙的です。
foo = 'bar';
func (function() {
console.log(foo);
});
これら2つのタイプのクロージャーの長所と短所は何ですか?
PHPでは、外部スコープの変数にアクセスする場合は、明示的に宣言する必要があります。
$foo = 'bar';
func (function() use ($foo) {
echo $foo;
});
しかし、JavaScriptでは、それらは暗黙的です。
foo = 'bar';
func (function() {
console.log(foo);
});
これら2つのタイプのクロージャーの長所と短所は何ですか?
PHPでは、外部スコープの変数にアクセスする場合は、明示的に宣言する必要があります[...]
use ($foo)
$foo
技術的には、関数は外部スコープでアクセスしていません。そのためには、次のことを行う必要があります。
$foo = 'bar';
$func = function() {
global $foo;
echo $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
これら2つのタイプのクロージャーの長所と短所は何ですか?
スタックではなく「ヒープ」タイプのスコープを使用することで、可変環境が関数にアタッチされたままになるため、ファーストクラスの関数は、作成(または受け渡し)を気にせずに受け渡しおよび呼び出すことができるため、はるかに柔軟になります。関数を使用可能にするための変数の特定のセット。
PHPがこれを行うのは、未設定の変数が空の文字列のように機能するため、外部変数を使用するつもりかどうかがわからないためです。したがって、このタイプのクロージャーはPHPには必要ですが、Javascriptには必要ありません。