在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',正如闭包所指示的那样。然而,这种方法在我看来有点丑陋,有没有更好的方法?
发布于 2011-01-10 05:02:44
正如其他人所说,这似乎不是正确的做法。你应该解释你为什么想要这样做,以及你想要实现什么。
无论如何,一种可能的方法是访问函数中对象的属性。示例:
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));发布于 2011-01-10 04:52:57
您的代码并没有破坏闭包,您只是获取了组成函数的代码,并在不同的上下文中计算它(其中标识符src具有不同的值)。它与您在原始src上创建的闭包没有任何关系。
不可能检查在闭包中捕获的数据。在某种意义上,这样的数据甚至比Java、C++、C#等中的私有成员更“私有”,在这些私有成员中,你可以使用反射或指针魔法来访问它们。
发布于 2012-05-21 03:21:39
如果您试图在一个循环中创建多个类似的方法,这可能会很有用。例如,如果您在一个循环中创建一个click处理程序,该处理程序依赖于一个循环变量在每个处理程序中执行一些稍微不同的操作。(我删除了"eval“,因为它是不必要的,通常不应该使用)。
// 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: 3https://stackoverflow.com/questions/4641662
复制相似问题