在不将其绑定到window对象的情况下,实现此类操作的正确方法是什么?
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“的对象来达到同样的效果。
发布于 2013-07-10 16:46:42
好吧,猜猜发生了什么,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变量是全局变量。它们也在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
}发布于 2013-07-10 16:47:10
如果你想保持你的窗口对象干净,这可能就是你需要的。
(function(){
  var foo = 'bar';
  (function(){
      console.log(foo) // bar
  })();
})();
console.log(window.foo); //undefined发布于 2013-07-10 16:48:55
答案是,在PHP中,您选择要包含的内容。在JS中,没有办法告诉闭包选择要包含的变量。所有词法上可用的变量都包含在内。
但是很难知道你想要什么,看起来你想隐藏一个闭包变量
唯一的解决办法是隐藏您不想要的变量(通过在内部函数中声明它们
https://stackoverflow.com/questions/17565891
复制相似问题