6

別の関数を返しているため、変数が宣言された関数の外に変数が存在する理由を理解していると思います。

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() の呼び出しはゲッターのようなものです。

Q: A(123) の呼び出しがセッターになるように myFunction を作成するにはどうすればよいですか?

4

6 に答える 6

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/

于 2013-03-31T23:42:13.230 に答える
1

jsFiddle デモ

返された関数に引数を受け入れさせます。セッターとして使用します。

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'
于 2013-04-01T00:02:05.653 に答える
0

この質問を再検討すると、次のようにできることがわかります。

    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)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

于 2015-04-29T16:02:30.547 に答える