将变量注入闭包

M K*_*M K 0 javascript php closures

在没有将它绑定到窗口对象的情况下,实现这样的东西的正确方法是什么?

x = function(fn)
{
    foo = 'bar';
    fn();
}

x(function()
{
    console.log(foo) // error happens here
});
Run Code Online (Sandbox Code Playgroud)

在PHP中,您可以通过"use"指令.

$foo = 'bar';
$fn = function() use($foo)
{
    echo $foo; // bar
}
Run Code Online (Sandbox Code Playgroud)

编辑:我改变了一段代码.我想要实现的是,在闭包中使一个声明的变量可用,而不需要在那里传递它.

foo = 'bar';
console.log(foo) // bar
console.log(window.foo) // bar
console.log(this.foo) // bar
Run Code Online (Sandbox Code Playgroud)

我希望实现相同的效果,另一个对象被绑定为"this".

Flo*_*ine 7

嗯,猜猜看,JavaScript有真正的闭包.不像PHP那样是半生不熟的,你必须手动声明你想要使用的闭包中的所有变量.

相当于这个PHP代码:

$foo = 'bar';
$fn = function() use($foo)
{
    echo $foo; // bar
}
Run Code Online (Sandbox Code Playgroud)

这是在JS:

var foo = 'bar';
var fn = function() {
    console.log(foo);
};
Run Code Online (Sandbox Code Playgroud)

是的.你不是用PHP调用你的函数,为什么我会在JS例子中调用它?:-)

顺便说一下,如果你在JS控制台中运行这段代码:

var foo = 'bar';
var fn = function() {
    console.log(foo);
};
fn();
Run Code Online (Sandbox Code Playgroud)

您将看到"bar"已记录.证明闭包工作而不需要一些黑客攻击.(use)

关于全局变量:$foo变量在PHP示例中是全局变量.它们也在JS的例子中.如果要拥有非全局变量,则需要本地环境.大多数时候,一个功能.

带有非全局变量的PHP示例:

function baz() {
    $foo = 'bar';
    $fn = function() use ($foo) {
        echo $foo;
    };
}
Run Code Online (Sandbox Code Playgroud)

带有非全局变量的JS示例:

function baz() {
    var foo = 'bar';
    var fn = function() {
        console.log(foo);
    };
}
Run Code Online (Sandbox Code Playgroud)

最后一点注意:如果你不使用var在JS中声明新变量,那么它们就是隐含的全局变量.在浏览器中,这意味着它们附加在window对象上.

如果你想要PHP/JS比较如何声明全局变量:

PHP代码:

$foo; // global
function bar() {
    $_GLOBAL['baz']; // global
    $bin; // local
}
Run Code Online (Sandbox Code Playgroud)

JS代码:

foo; // global
function bar() {
    window.baz; // global
    var bin; // local
    booze; // implied global
}
Run Code Online (Sandbox Code Playgroud)