首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >向闭包中注入变量

向闭包中注入变量
EN

Stack Overflow用户
提问于 2013-07-10 16:33:17
回答 5查看 1.3K关注 0票数 0

在不将其绑定到window对象的情况下,实现此类操作的正确方法是什么?

代码语言:javascript
运行
复制
x = function(fn)
{
    foo = 'bar';
    fn();
}

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

在PHP中,你可以通过"use“指令来实现。

代码语言:javascript
运行
复制
$foo = 'bar';
$fn = function() use($foo)
{
    echo $foo; // bar
}

编辑:我对这段代码做了一些修改。我想要实现的是,使声明的变量在闭包中可用,而不需要将其传递到闭包中。

代码语言:javascript
运行
复制
foo = 'bar';
console.log(foo) // bar
console.log(window.foo) // bar
console.log(this.foo) // bar

我想用另一个绑定为"this“的对象来达到同样的效果。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-07-10 16:46:42

好吧,猜猜发生了什么,JavaScript有真正的闭包。而不是像PHP那样半生不熟的,你必须在闭包中手动声明你想要使用的所有变量。

相当于下面的PHP代码:

代码语言:javascript
运行
复制
$foo = 'bar';
$fn = function() use($foo)
{
    echo $foo; // bar
}

这是在JS中吗:

代码语言:javascript
运行
复制
var foo = 'bar';
var fn = function() {
    console.log(foo);
};

是啊。您没有在PHP中调用您的函数,为什么我要在JS示例中调用它?:-)

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

代码语言:javascript
运行
复制
var foo = 'bar';
var fn = function() {
    console.log(foo);
};
fn();

您将看到"bar“记录。证明闭包在不需要修改的情况下可以工作。(use)

关于全局变量:在您的示例中,$foo变量是全局变量。它们也在JS示例中。如果你想拥有一个非全局变量,你需要一个本地环境。大多数情况下,一个函数。

使用非全局变量的PHP示例:

代码语言:javascript
运行
复制
function baz() {
    $foo = 'bar';
    $fn = function() use ($foo) {
        echo $foo;
    };
}

使用非全局变量的JS示例:

代码语言:javascript
运行
复制
function baz() {
    var foo = 'bar';
    var fn = function() {
        console.log(foo);
    };
}

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

如果您想要对如何声明全局变量进行PHP/JS比较:

PHP代码:

代码语言:javascript
运行
复制
$foo; // global
function bar() {
    $_GLOBAL['baz']; // global
    $bin; // local
}

JS代码:

代码语言:javascript
运行
复制
foo; // global
function bar() {
    window.baz; // global
    var bin; // local
    booze; // implied global
}
票数 7
EN

Stack Overflow用户

发布于 2013-07-10 16:47:10

如果你想保持你的窗口对象干净,这可能就是你需要的。

代码语言:javascript
运行
复制
(function(){

  var foo = 'bar';

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

})();

console.log(window.foo); //undefined
票数 0
EN

Stack Overflow用户

发布于 2013-07-10 16:48:55

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

但是很难知道你想要什么,看起来你想隐藏一个闭包变量

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17565891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档