在PHP中,如果要访问外部作用域中的变量,则需要明确声明它,例如
$foo = 'bar';
func (function() use ($foo) {
echo $foo;
});
但在JavaScript中,它们是隐含的,例如。
foo = 'bar';
func (function() {
console.log(foo);
});
这两种封闭的优点和缺点是什么?
答案 0 :(得分: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
的{{1}}将保留其价值,因为它已被关闭到该函数中。
要在JavaScript中执行相同的操作,只需在函数中创建一个函数,然后创建一个闭包(让内部函数访问封闭函数的作用域):
$foo
这两种封闭的优点和缺点是什么?
使用“堆”类型范围而不是堆栈,以便变量环境保持附加到函数允许第一类函数更灵活,因为它们可以传递和调用而不必担心创建(或传入一组特定的变量以使函数可用。
答案 1 :(得分:0)
PHP这样做是因为它不知道你是否打算使用外部变量,因为未设置的变量就像一个空字符串。因此,PHP需要这种类型的闭包,但不适用于Javascript。