如何在 javascript 中访问父函数闭包

How do I access parent functions closure in javascript?

本文关键字:函数 闭包 访问 javascript      更新时间:2023-09-26

以下情况下,我将如何访问父函数"var"变量(我只能编辑重置函数的定义):

_.bind(function(){
    var foo = 5;
    var reset = function(){
        foo = 6;  //this changes foo,
        bar = 7;  //**I want this to add another "var", so I don't pollute global scope
    }
    reset();
    console.log(foo); //6
    console.log(bar); //7
}, window);

对不起,但你不能。

访问命名空间的唯一方法是 with 语句。

例如,如果你能够重写整个事情,它可以像这样完成:

_.bind(function(){
    var parentNamespace = {
        foo: 5,
    };
    with (parentNamespace) {
        var reset = function(){
            foo = 6;  //this changes foo,
            parentNamespace.bar = 7;  //**I want this to add another "var", so I don't pollute global scope
        }
        reset();
        console.log(foo); //6
        console.log(bar); //7
    }
}, window);

但这

很可能几乎肯定是一个坏主意。

这对你有用吗?

_.bind(function(){
    var foo = 5, bar;
    var reset = function(){
        foo = 6;  //this changes foo,
        bar = 7;  //**I want this to add another "var", so I don't pollute global scope
    }
    reset();
    console.log(foo); //6
    console.log(bar); //7
}, window);

我不确定我是否理解你的问题,所以我的答案可能不是你想要的。

var reset = function(){
    foo = 6;  
    reset.bar = 7;   
}
reset.bar = 13;
reset();  // reset.bar is back to 7.

ECMA-262 确实阻止访问函数的变量对象(函数实际上不必有一个,它们只需要表现得好像它们有一样),所以你无法访问它。

您只能通过在适当的范围内声明变量或将它们包含在 FunctionStatementFunctionExpression 的形式参数列表中来添加属性,没有其他方法。