在闭包范围中设置变量

时间:2013-03-31 23:38:28

标签: javascript closures

我想我理解为什么变量存在于它们声明的函数之外,因为你要返回另一个函数:

myFunction = function() {
    var closure = 'closure scope'
    return function() {
        return closure;
    }
}
A = myFunction(); // myFunction returns a function, not a value
B = A(); // A is a function, which when run, returns:
console.log(B); // 'closure scope'

现在写的方式,调用A()就像一个吸气剂。

问:如何编写myFunction以便调用A(123)是一个setter?

6 个答案:

答案 0 :(得分:8)

尝试以下方法:

myFunction = function() {
    var closure = 'closure scope'

    // value is optional
    return function(value) {
        // if it will be omitted
        if(arguments.length == 0) {
            // the method is a getter
            return closure;
        } else {
            // otherwise a setter
            closure = value;
            // with fluid interface ;)
            return this;
        }
    }
}
A = myFunction(); // myFunction returns a function, not a value
A(123); // set value
B = A(); // A is a function, which when run, returns:
console.log(B); // '123'

答案 1 :(得分:3)

如果你想要getter和setter,你可以做这样的事情:

var func = function() {
  var closure = 'foo';

  return {
    get: function() { return closure; },
    set: function(value) { closure = value; }
  }
};

var A = func();

A.set('foobar');
console.log(A.get()); //=> "foobar"

答案 2 :(得分:2)

应该如此简单:

myFunction = function() {
    var closure = 'closure scope'
    return function(setTo) {
        if (typeof setTo !== "undefined") {
            closure = setTo;
            return this; //support call chaining, good idea hek2mgl
        } else {
            return closure;
        }
    }
}

由于closure变量位于函数范围的闭包内,因此您应该能够以与它相同的方式分配它。

参见jsFiddle:http://jsfiddle.net/WF4VT/1/

答案 3 :(得分:2)

另一种选择是使用类并定义getter和setter:

function MyClass(p){
    this._prop = p;
}
MyClass.prototype = {
    constructor: MyClass,
    get prop(){
        return this._prop;
    },
    set prop(p){
        this._prop = p;
    }
}

var myObject = new MyClass("TEST");
console.log(myObject.prop);
myObject.prop = "test";
console.log(myObject.prop);

演示:http://jsfiddle.net/louisbros/bMkbE/

答案 4 :(得分:1)

<强> jsFiddle Demo

让您返回的函数接受参数。将它用作制定者:

myFunction = function() {
 var closure = 'closure scope';
 return function(val) {
    closure = val;
    return closure;
 }
}
A = myFunction(); // myFunction returns a function, not a value
B = A(123); // A is a function, which when run, returns:
console.log(B); // 'closure scope'

答案 5 :(得分:0)

重新审视这个问题,我发现我可以这样做:

&#13;
&#13;
    function outside() {
    	var result = 'initialized'
    	return inside
    	function inside(argVariable) {
    		if(arguments.length) {
    			result = argVariable
    			return this
    		} else {
    			return result
    		}
    	}
    }
    myFunction = outside() // outside returns a function
    X = myFunction() // returns: 'initialized'
    $('body').append(X + '<br>')
    myFunction(123) // setter
    X = myFunction() // returns: 123
    $('body').append(X)
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;