在 PHP 中,如果要访问外部范围内的变量,则需要显式声明它,例如
$foo = 'bar';
func (function() use ($foo) {
echo $foo;
});
但在 JavaScript 中,它们是隐式的,例如
foo = 'bar';
func (function() {
console.log(foo);
});
这两种闭包的优缺点是什么?
在 PHP 中,如果要访问外部范围内的变量,则需要显式声明它,例如
$foo = 'bar';
func (function() use ($foo) {
echo $foo;
});
但在 JavaScript 中,它们是隐式的,例如
foo = 'bar';
func (function() {
console.log(foo);
});
这两种闭包的优缺点是什么?
在 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
这两种闭包的优缺点是什么?
使用“堆”类型范围,而不是堆栈,以便变量环境保持附加到函数允许一流函数更加灵活,因为它们可以传递和调用,而无需担心创建(或传入)一组特定的变量,以使函数可用。
PHP 这样做是因为它不知道您是否打算使用外部变量,因为未设置的变量就像一个空字符串。因此 PHP 需要这种类型的闭包,而 Javascript 则不需要。