0

这类似于我今天问的另外两个问题,但我仍在尝试了解如何在 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

首先,函数是 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;
   }
}

这个函数没有被执行,你只是作为你的 beep 函数的值返回。

所以,在我们的例子中,唯一真正被执行的代码是:

var myApplication = {};

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

在这种情况下,您只记录传递给 的第一个参数beep,所以3then undefined

现在对于您想要在这里做的事情,无需使用闭包或原型:

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 回答
1

当你第一次调用 beep(3) 时,它会返回一个函数——但你实际上并没有对该函数做任何事情。我想你可能是在倒数第二行的意思?...:

myApplication.beep = myApplication.beep(3);

事实上,我认为对 beep 的第二次调用只是返回另一个函数,但它的“x”参数设置为未定义。

另外:为了节省一些代码编写,而不是声明然后分配“哔”,你可以这样写:

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

或者,可以从一开始就立即声明整个对象:

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