0

これは、今日私が尋ねた他の 2 つの質問と似ていますが、JavaScript で変数を正しく割り当てる方法をまだ理解しようとしています。

私のコードへの出力は次のとおりです。

x: 3
x: undefined // I was expecting 3 here

そして、ここに私のコードがあります:

var myApplication = {};

(function() {
    function beep(x) {
        console.log('x: ' + x);
        var closure = {};
        return function() {
            console.log('return function() {');
            if (arguments.length) {
                console.log('setter: ' + x);
                closure.result = x;
            } else {
                console.log('getter: ' + closure.result);
                return closure.result;
            }
        }
    }
    myApplication.beep = beep;
})();
myApplication.beep(3);
RESULT = myApplication.beep();

私が言うところに問題があると思います: myApplication.beep = beep; プロトタイプまたは他の方法で割り当てる必要があると思います。

4

2 に答える 2

1

初めて beep(3) を呼び出すと、関数が返されますが、実際にはその関数で何もしていません。最後から2番目の行でこれを意味していたのではないでしょうか?...:

myApplication.beep = myApplication.beep(3);

そのままでは、beep の 2 回目の呼び出しは別の関数を返しているだけだと思いますが、その 'x' 引数は未定義に設定されています。

また、「ビープ音」を宣言してから割り当てるのではなく、コード記述を節約するには、次のように記述します。

myApplication.beep = function(x) { ...

または、オブジェクト全体を最初から一度に宣言できます。

myApplication = {
  beep: function(x) {
  },
  otherFn: function(y) {
  }
}
于 2013-10-09T20:04:48.323 に答える
1

まず第一に、関数は JavaScript の第一級市民です。

だからあなたがするとき

return function() {
   console.log('return function() {');
   if (arguments.length) {
      console.log('setter: ' + x);
      closure.result = x;
   } else {
      console.log('getter: ' + closure.result);
      return closure.result;
   }
}

この関数は実行されません。ビープ関数の値として返されるだけです。

したがって、私たちの場合、実際に実行される唯一のコードは次のとおりです。

var myApplication = {};

(function() {
    function beep(x) {
        console.log('x: ' + x);
    }
    myApplication.beep = beep;
})();
myApplication.beep(3);
RESULT = myApplication.beep();

この場合、に渡された最初の引数のみをログに記録しているbeepので3undefined.

ここでやりたいことのために、クロージャーやプロトタイプを使用する必要はありません:

var myApplication = {
  x : null,
  beep : function (x) {
    if (typeof x != 'undefined') {
      this.x = x;
    } else {
      return this.x;
    }
  }
};

// set x
myApplication.beep(3);
// get x
var x = myApplication.beep();
console.log('x :', x);

あまりにも早く閉鎖をいじることは避けたいと思います。

于 2013-10-09T20:03:24.047 に答える