在闭包中使用PHP的显式变量的优点

时间:2012-04-25 16:10:36

标签: php javascript design-patterns closures anonymous-function

在PHP中,如果要访问外部作用域中的变量,则需要明确声明它,例如

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

    echo $foo;

});

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

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

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

2 个答案:

答案 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。