2

次のシナリオで親関数の「var」変数にアクセスするにはどうすればよいですか (リセット関数の定義しか編集できません)。

_.bind(function(){
    var foo = 5;

    var reset = function(){
        foo = 6;  //this changes foo,
        bar = 7;  //**I want this to add another "var", so I don't pollute global scope
    }
    reset();
    console.log(foo); //6
    console.log(bar); //7
}, window);
4

4 に答える 4

1

申し訳ありませんが、できません。

名前空間にアクセスできる唯一の方法はwithステートメントです。

たとえば、すべてを書き直すことができた場合、次のようにすることができます。

_.bind(function(){
    var parentNamespace = {
        foo: 5,
    };

    with (parentNamespace) {
        var reset = function(){
            foo = 6;  //this changes foo,
            parentNamespace.bar = 7;  //**I want this to add another "var", so I don't pollute global scope
        }
        reset();
        console.log(foo); //6
        console.log(bar); //7
    }
}, window);

しかし、これは最も可能性が高いほぼ間違いなく悪い考えです。

于 2012-04-18T01:03:11.257 に答える
1

これはうまくいきますか?

_.bind(function(){
    var foo = 5, bar;

    var reset = function(){
        foo = 6;  //this changes foo,
        bar = 7;  //**I want this to add another "var", so I don't pollute global scope
    }
    reset();
    console.log(foo); //6
    console.log(bar); //7
}, window);
于 2012-04-18T01:03:51.967 に答える
0

ECMA-262 では、関数の変数オブジェクトへのアクセスが明示的に禁止されているため (関数は実際に変数オブジェクトを持つ必要はなく、関数が持つように動作する必要があるだけです)、アクセスできません。

プロパティを追加するには、適切なスコープで変数を宣言するか、FunctionDeclarationまたはFunctionExpressionの仮パラメータ リストに含める必要があります。他の方法はありません。

于 2012-04-18T03:14:25.570 に答える
0

私はあなたの質問を理解しているかどうかわからないので、私の答えはあなたが望むものではないかもしれません.

var reset = function(){
    foo = 6;  
    reset.bar = 7;   
}
reset.bar = 13;
reset();  // reset.bar is back to 7.
于 2012-04-18T01:59:00.353 に答える