首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在JavaScript中打破闭包

如何在JavaScript中打破闭包
EN

Stack Overflow用户
提问于 2011-01-10 04:44:58
回答 5查看 2.4K关注 0票数 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()));

这将打印'9',而不是'3',正如闭包所指示的那样。然而,这种方法在我看来有点丑陋,有没有更好的方法?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-01-10 05:02:44

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

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

代码语言:javascript
复制
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));
票数 1
EN

Stack Overflow用户

发布于 2011-01-10 04:52:57

您的代码并没有破坏闭包,您只是获取了组成函数的代码,并在不同的上下文中计算它(其中标识符src具有不同的值)。它与您在原始src上创建的闭包没有任何关系。

不可能检查在闭包中捕获的数据。在某种意义上,这样的数据甚至比Java、C++、C#等中的私有成员更“私有”,在这些私有成员中,你可以使用反射或指针魔法来访问它们。

票数 9
EN

Stack Overflow用户

发布于 2012-05-21 03:21:39

如果您试图在一个循环中创建多个类似的方法,这可能会很有用。例如,如果您在一个循环中创建一个click处理程序,该处理程序依赖于一个循环变量在每个处理程序中执行一些稍微不同的操作。(我删除了"eval“,因为它是不必要的,通常不应该使用)。

代码语言:javascript
复制
// Assign initial value
var src = 3;

// This is the regular js closure.  Variables are saved by reference.  So, changing the later will
// change the internal value.
var byref = function() {
  return src;
}

// To "break" the closure or freeze the external value the external function is create and executed
// immidiatly.  It is used like a constructor function which freezes the value of "src".
var byval = function(s) {
  return function() { return s };
}(src);

src = 9;

alert("byref: " + byref()); // output: 9
alert("byval: " + byval()); // output: 3
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4641662

复制
相关文章

相似问题

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