将变量注入闭包

时间:2013-07-10 08:33:17

标签: php javascript closures

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

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

x(function()
{
    console.log(foo) // error happens here
});

在PHP中,您可以通过“use”指令。

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

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

foo = 'bar';
console.log(foo) // bar
console.log(window.foo) // bar
console.log(this.foo) // bar

我想达到同样的效果,另一个对象被绑定为“this”。

5 个答案:

答案 0 :(得分:7)

嗯,猜猜看,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();

您将看到“bar”已记录。证明闭包工作而不需要一些黑客攻击。 (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
}

答案 1 :(得分:0)

如果你想让你的窗户物体保持清洁,那么这可能是你需要的。

(function(){

  var foo = 'bar';

  (function(){
      console.log(foo) // bar
  })();

})();

console.log(window.foo); //undefined

答案 2 :(得分:0)

答案是在PHP中选择要包含的内容。在JS中,没有办法告诉闭包选择要包含的变量。附上所有词汇可用变量。

但是很难说出你想要的东西,看起来你想要隐藏一个闭包变量

唯一的解决方法是隐藏变量(通过在内部函数中声明它们)你不想要

答案 3 :(得分:0)

在你问题的后半部分,你会问到打电话 将this设置为指定对象的函数。

调用函数funthis设置为objectThatBecomesThis并将参数设置为(arg1,arg2,...),使用:

fun.apply(objectThatBecomesThis, [arg1,arg2,...])

其中第二个参数(可选)是函数的参数数组。

因为第二个参数是一个数组,所以它使用[]方括号。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply

答案 4 :(得分:-1)

如果我了解您的需要,您可以这样做:

var closure_variables = new Object();;
closure_variables.foo = 'bar';
window.bar = 'foo'

(function(variables)
{
    console.log(variables.foo) // undefined
    console.log(bar) // foo
})(closure_variables)

或者你甚至可以在参数中直接传递foo。