如何在JavaScript中打破闭包

Not*_*ame 9 javascript

有没有办法在JavaScript中轻松打破一个闭包?我得到的最接近的是:

var src = 3;
function foo () {
    return function () {
        return src; }
    }
function bar (func) {
    var src = 9;
    return eval('('+func.toString()+')')(); // This line
}
alert(bar(foo()));
Run Code Online (Sandbox Code Playgroud)

这将打印'9',而不是'3',因为封闭将决定.然而,这种方法对我来说似乎有点难看,有没有更好的方法?

Jak*_*kob 9

你的代码没有打破闭包,你只是将代码组成一个函数并在不同的上下文中评估它(标识符src具有不同的值).它与你在原版上创建的闭包没有任何关系src.

检查已在闭包中捕获的数据是不可能的.从某种意义上说,这些数据甚至比Java,C++,C#等私有成员更"私密",无论如何你总是可以使用反射或指针魔法来访问它们.


RoT*_*oRa 1

正如其他人所说,这似乎不是正确的做法。您应该解释为什么您想要这个以及您想要实现什么。

无论如何,一种可能的方法是访问函数内对象的属性。例子:

var src = 3;

function foo (context) {
    context = context || window; // Fall back to the global namespace as default context

    return function () {
        return context.src; 
    }
}

function bar (func) {
    var context = {src: 9};
    return func(context);
}

alert(bar(foo));
Run Code Online (Sandbox Code Playgroud)