Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP的优势';s在闭包中使用时的显式变量_Php_Javascript_Design Patterns_Closures_Anonymous Function - Fatal编程技术网

PHP的优势';s在闭包中使用时的显式变量

PHP的优势';s在闭包中使用时的显式变量,php,javascript,design-patterns,closures,anonymous-function,Php,Javascript,Design Patterns,Closures,Anonymous Function,在PHP中,如果要访问外部作用域中的变量,则需要显式声明它,例如 $foo = 'bar'; func (function() use ($foo) { echo $foo; }); 但是在JavaScript中,它们是隐式的,例如 foo = 'bar'; func (function() { console.log(foo); }); 这两种类型的闭包的优缺点是什么?PHP之所以这样做,是因为它不知道是否要使用外部变量,因为未设置的变量就像一个空字符串。因此,PHP需

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

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

    echo $foo;

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

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

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

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

在PHP中,如果希望访问外部作用域中的变量,则需要 明确声明它[…]
use($foo)

从技术上讲,您的函数没有访问外部作用域中的
$foo
。为此,您需要:

$foo = 'bar';
$func = function() {
    global $foo;
    echo $foo;
};
这不是结束函数中没有关闭的变量。如果更改了
$foo
的值,对
func
的下一次调用将反映:

$func(); // bar
$foo = 'baz';
$func(); // baz
但是,如果我们使用
func
关闭
$foo

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

$func(); // bar
$foo = 'baz';
$func(); // bar
func
$foo
将保留其值,因为它已关闭到函数中

要在JavaScript中执行同样的操作,只需在函数中创建一个函数,并将创建一个闭包(允许内部函数访问封闭函数的作用域):

这两种闭合方式的优缺点是什么


使用“heap”类型的作用域,而不是堆栈,从而使变量环境与函数保持连接,这样可以使一级函数更加灵活,因为它们可以传递和调用,而无需担心创建(或传入)使函数可用的一组特定变量。

因为JavaScript基于作用域而不是类扩展/接口等。这是一个BIIIG主题,你应该考虑多问谷歌这个快速查询:为什么.js在Func’bar上两次返回的唯一原因是因为在声明的变量被分配了不同的值之前调用了GETFUNC?值已传入(在`func=getFunc(foo);`中声明)并且在值更改之前执行了脚本?但是如果您使用(&$foo),它的工作原理与JavaScript示例中的相同。PHP只是有通过值或引用捕获的选项;而JavaScript只是通过引用,它们将具有相同的外部效果。然而,潜在的机制是不同的。一个是带有引用的闭包。另一个是访问全局变量的匿名函数。如果您阅读PHP文档:,“匿名函数,也称为闭包”,那么您的第一个示例是错误的,或者他们的文档是错误的?PHP因重新定义编程概念而臭名昭著,例如。维基百科在这方面做得更好。请注意它们在和上的两个单独的文章。
function getFunc(foo) {
    return function () {
        console.log(foo);
    };
}

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