1

在 PHP 中,如果要访问外部范围内的变量,则需要显式声明它,例如

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

    echo $foo;

});

但在 JavaScript 中,它们是隐式的,例如

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

这两种闭包的优缺点是什么?

4

2 回答 2

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's$foo将保留它的价值,因为它已被封闭到函数中。

要在 JavaScript 中做同样的事情,您只需在函数中创建一个函数,然后将创建一个闭包(让内部函数访问封闭函数的范围):

function getFunc(foo) {
    return function () {
        console.log(foo);
    };
}

foo = "bar";
func = getFunc(foo);
func(); // bar
foo = "baz";
func(); // bar

这两种闭包的优缺点是什么?

使用“堆”类型范围,而不是堆栈,以便变量环境保持附加到函数允许一流函数更加灵活,因为它们可以传递和调用,而无需担心创建(或传入)一组特定的变量,以使函数可用。

于 2012-04-25T16:28:35.520 回答
0

PHP 这样做是因为它不知道您是否打算使用外部变量,因为未设置的变量就像一个空字符串。因此 PHP 需要这种类型的闭包,而 Javascript 则不需要。

于 2012-04-25T16:16:41.650 回答