0

我有这个,它的工作原理:

myObject.myFunction = (function() {
    var closure = 0;

    return function(value) {
        if (arguments.length) {
            closure = value;
        } else {
            return closure;
        }
    }
})();

它同时充当 getter 和 setter,因此调用 myFunction(3.14) 将设置闭包,调用 myFunction() 将获得闭包的值。

问:我可以把它分解成一个更冗长的例子(而不是荒谬的)吗?我想做的是这样的:

myObject.myFunction1 = myFunction2;
myObject.myFunction1();

function myFunction2() {
    var closure = 0;

    return function(value) {
        if (arguments.length) {
            closure = value;
        } else {
            return closure;
        }
    }
}

我只是试图将 JavaScript 分解成尽可能小的块,以便我的学生可以集中精力。

编辑1:

哦等等:我根本不需要 myFunction2。

4

5 回答 5

2

您是否只是在寻找解释闭包的最简单方法,例如:

function closure() {
    var privateData = "I'm hidden!";

    return {
        get: function () {
            return privateData;
        },
        set: function (arg) {
            privateData = arg;
        }
    };
}

var privateDataAccess = closure();

console.log(typeof (privateData)); // logs undefined -- privateData is out of scope
console.log(privateDataAccess.get()); // logs "I'm hidden!"
privateDataAccess.set("Now you changed me!");
console.log(privateDataAccess.get()); // logs "Now you changed me!"

这可能就像我想的一样简单:-)

于 2013-04-18T19:07:11.163 回答
1

在您的第一个示例中,您将内部函数分配给属性“myFunction”。

在第二个示例中,您将外部函数分配给属性“myfunction2”。

这会导致不同的行为,因为第一个示例使用立即调用的函数表达式,而第二个示例将名为“myFunction2”的已声明函数分配给“myFunction1”。为了调用内部函数,您实际上必须执行类似的操作。

myObject.myFunction1 = myFunction2;
var myFunction3 = myObject.myFunction1();
myFunction3();

或者

myObject.myFunction1 = myFunction2();
myObject.myFunction1();
于 2013-04-18T18:55:07.507 回答
1

如果我理解你,myObject.myFunction1 = myFunction2();应该工作。

但是,我真的看不出将这种模式用于简单的 getter 和 setter 有什么好处。您的“闭包”变量只能从 getter/setter 内部访问,并且该函数只是简单地设置它的值(不转换它)。我的意思是,同样可以使用对象上的常规属性而不是函数来完成。


现在我更加关注您正在寻找一种更好的方式来解释闭包的事实。您可以为变量和函数使用有意义、准确的名称,并添加注释。根据您的代码,这是一个建议:

function createClosure() {
    // Only the function returned below can see the secret
    var secret = 0;
    return function(value) {
        // If anything was passed, change secret (returns undefined)
        if (arguments.length) {
            secret = value;
        // Nothing was passed, return secret
        } else {
            return secret;
        }

    }
}

// Create a function that enables access to the secret
var closure = createClosure();

// Use it to read the secret
console.log('the closure holds the secret: ' + closure());

// Use it to change the secret
closure(10);

// Read it again to check
console.log('the secret now holds ' + closure());
于 2013-04-18T18:57:52.203 回答
0

我想这就是我正在寻找的:

function ConjunctionJunction() {
    var myClosure = 0;

    return function(myValue) {
        if (arguments.length) {
            myClosure = myValue;
        } else {
            return myClosure;
        }
    }
};
myObject = new Object();
myObject.myFunction = ConjunctionJunction(); // This creates a function and assigns it to the variable myObject.myFunction
myObject.myFunction(3.14); // This calls the newly created function as a setter
var x = myObject.myFunction(); // This calls it as a getter, which returns a value.
log(x);
于 2013-04-18T18:59:16.447 回答
0

不,等等。我想这就是我要找的。这可能真的是:

myObject = new Object();

;(function($, window, undefined) {
    var Variables = {};

    myObject.myFunction = function(argValue) {
        if (arguments.length) {
            Variables.myValue = argValue;
        } else {
            return Variables.myValue;
        }
    }
})(jQuery, window);


myObject.myFunction(3.14);
var x = myObject.myFunction();
log(x);
于 2013-04-18T19:16:45.793 回答