好吧,你猜怎么着,JavaScript 有真正的闭包。不像 PHP 那样半生不熟,你必须手动声明要使用的闭包中的所有变量。
此 PHP 代码的等价物:
$foo = 'bar';
$fn = function() use($foo)
{
echo $foo; // bar
}
这是在JS中:
var foo = 'bar';
var fn = function() {
console.log(foo);
};
是的。你不是在 PHP 中调用你的函数,我为什么要在 JS 示例中调用它?:-)
顺便说一句,如果你在 JS 控制台中运行这段代码:
var foo = 'bar';
var fn = function() {
console.log(foo);
};
fn();
您将看到记录了“栏”。证明闭包不需要一些技巧就可以工作。( use
)
关于全局变量:$foo
变量在您的 PHP 示例中是全局的。它们也在 JS 示例中。如果你想要一个非全局变量,你需要一个本地环境。大多数时候,一个函数。
具有非全局变量的 PHP 示例:
function baz() {
$foo = 'bar';
$fn = function() use ($foo) {
echo $foo;
};
}
具有非全局变量的 JS 示例:
function baz() {
var foo = 'bar';
var fn = function() {
console.log(foo);
};
}
最后一点:如果您不使用var
在 JS 中声明新变量,则它们是隐含的全局变量。在浏览器中,这意味着它们附加在window
对象上。
如果您想比较如何声明全局变量的 PHP/JS:
PHP代码:
$foo; // global
function bar() {
$_GLOBAL['baz']; // global
$bin; // local
}
JS代码:
foo; // global
function bar() {
window.baz; // global
var bin; // local
booze; // implied global
}