1

PHPでは、外部スコープの変数にアクセスする場合は、明示的に宣言する必要があります。

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

    echo $foo;

});

しかし、JavaScriptでは、それらは暗黙的です。

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

これら2つのタイプのクロージャーの長所と短所は何ですか?

4

2 に答える 2

2

PHPでは、外部スコープの変数にアクセスする場合は、明示的に宣言する必要があります[...]use ($foo)

$foo技術的には、関数は外部スコープでアクセスしていません。そのためには、次のことを行う必要があります。

$foo = 'bar';
$func = function() {
    global $foo;
    echo $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

これら2つのタイプのクロージャーの長所と短所は何ですか?

スタックではなく「ヒープ」タイプのスコープを使用することで、可変環境が関数にアタッチされたままになるため、ファーストクラスの関数は、作成(または受け渡し)を気にせずに受け渡しおよび呼び出すことができるため、はるかに柔軟になります。関数を使用可能にするための変数の特定のセット。

于 2012-04-25T16:28:35.520 に答える
0

PHPがこれを行うのは、未設定の変数が空の文字列のように機能するため、外部変数を使用するつもりかどうかがわからないためです。したがって、このタイプのクロージャーはPHPには必要ですが、Javascriptには必要ありません。

于 2012-04-25T16:16:41.650 に答える