1

我的目标是在编写干净代码的同时使用闭包。我注意到的一件事是,不知何故,我总是以某种方式重复自己,因为在不止一种情况下需要我的一个匿名函数。

为此,我希望将这些重复的函数存储在一个对象中,以便以后重用。

现在,我的问题。我已经创建了这个示例http://jsfiddle.net/tiagoespinha/tTx64/并且警报不会触发,因为y它是空的。

但是,如果我内联函数,一切正常http://jsfiddle.net/tiagoespinha/tTx64/1/

有没有办法解决这个问题?我怎样才能让它在第一个例子中工作?变量y还在,为什么JS抓不到呢?

4

4 回答 4

1

您希望对象具有自己的变量 (y) 和共享功能。

你真正需要的可能是原型。

function Holder() {
   this.y = 5;
   this.myFn();
}
Holder.prototype.myFn = function() {
    alert("The value of the closure var is " + this.y);           
}
new Holder();

我建议阅读面向对象的 JavaScript 简介,这样您就不会尝试仅使用闭包来重建 OOP。

于 2012-11-25T10:01:05.677 回答
1
//our constructor, each instance will carry a y of 5
function Proto() {
    this.y = 5;
}

//a shared function for all instances
Proto.prototype.returnedFn = function() {
    alert("The value of the closure var is " + this.y);
}

//just a wrapper for the new instance call.
//I just like it this way to avoid using "new" when making instances
function newFn() {
    //return a new instance
    return new Proto();
}

//test it out
newFn().returnedFn();
newFn().returnedFn();
于 2012-11-25T10:03:54.423 回答
1

您的第一个示例需要某种动态范围才能工作。Javascript 是静态作用域的。

闭包允许函数从它定义的范围中捕获一些局部变量。Holder.myFn未在包含变量的范围中定义y

另请注意,函数的每个实例都有自己的闭包。因此,不可能一次定义您的函数并让它y在不同的上下文中引用不同的 's。(在您的第二个示例中,每次调用时都会定义内部函数newFn,因此可以存在很多实例,每个实例都有自己的副本y。)

于 2012-11-25T10:35:50.223 回答
0

我还将为我自己的问题添加一个答案以报告我的发现。

基于提供的其他解决方案并部分使用 OOP 解决方案,我找到了另一种也使用闭包的方法。

// Object prototype which takes an argument 
function MyObj(abc) {

    // Declare function using a closure
    // and thus being able to use the argument
    this.myFn = (function(){
        return function() {
            alert("abc is " + abc);
        };
    })();                
}

// Then we can simply create an object with the
// desired argument and the function will behave as expected
var v = new MyObj(10);
v.myFn();

我认为没有人提供此解决方案可能是因为我忽略了我真的不想将值本地存储在对象中。我只是想传入一些值,在一个函数中使用它们,然后摆脱该对象。

在这种情况下,我相信纯粹的 OOP 解决方案可能是矫枉过正。

无论如何,感谢您提出的所有解决方案!​</p>

于 2012-11-25T13:53:21.603 回答