PHP 的显式变量在闭包中使用时的优势
Advantage of PHP's explicit variable when used in closure
在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
但是,如果我们以func
$foo
结束:
$foo = 'bar';
$func = function() use ($foo) {
echo $foo;
};
$func(); // bar
$foo = 'baz';
$func(); // bar
func
的$foo
将保留它的值,因为它已被封闭到函数中。
要在 JavaScript 中执行相同的操作,您只需在函数内创建一个函数,然后创建一个闭包(允许内部函数访问封闭函数的范围):
function getFunc(foo) {
return function () {
console.log(foo);
};
}
foo = "bar";
func = getFunc(foo);
func(); // bar
foo = "baz";
func(); // bar
这两种闭合的优缺点是什么?
使用"堆"类型作用域,而不是堆栈,以便变量环境保持附加到函数,使一等函数更加灵活,因为它们可以传递和调用,而不必担心创建(或传入)一组特定的变量以使函数可用。
PHP 这样做是因为它不知道你是否打算使用外部变量,因为未设置的变量就像一个空字符串。因此,这种类型的闭包对于PHP是必需的,但对于Javascript则不是必需的。
相关文章:
- 子类访问父类's闭包变量
- 构造函数函数闭包变量
- 如何冻结函数's在闭包中的变量
- 使变量可用于不带闭包的异步调用
- 局部变量在闭包中丢失
- 其中是闭包中存储的变量-堆栈或堆
- javascript闭包:保护内部变量
- Javascript:附加字符串中的事件,闭包中的变量求值
- "可变变量可从闭包“”访问;在传递给Array.prototype.every的函数中
- JavaScript闭包和变量引用
- Javascript分析之谜 - 闭包变量
- 对闭包变量的更改是否在使用闭包的回调中可见
- 使用object.assign()添加到对象中的getter发现闭包变量的值错误
- Javascript:为什么对闭包变量的访问可能很慢
- 模块中未更新Nodejs闭包变量
- node.js捕获闭包变量
- Javascript中绑定闭包变量
- 函数外部的Javascript闭包变量访问
- 回调函数访问闭包变量
- 为什么我的闭包变量在使用$后被清除.每个都使用JSON数据