Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何定义应用程序的方法_Javascript_Getter Setter - Fatal编程技术网

Javascript 如何定义应用程序的方法

Javascript 如何定义应用程序的方法,javascript,getter-setter,Javascript,Getter Setter,这与我今天提出的另外两个问题类似,但我仍在努力理解如何在JavaScript中正确分配变量 我的代码的输出如下: x: 3 x: undefined // I was expecting 3 here 这是我的代码: var myApplication = {}; (function() { function beep(x) { console.log('x: ' + x); var closure = {}; return funct

这与我今天提出的另外两个问题类似,但我仍在努力理解如何在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;
我认为我必须通过原型或其他方式分配它。

首先,函数是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
的第一个参数,因此
3
然后是
未定义的

现在,对于您想要在这里执行的操作,无需使用闭包或原型:

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);
我会避免过早地处理闭包。

当您第一次调用beep(3)时,它会返回一个函数,但实际上您并没有对该函数执行任何操作。我想你可能在倒数第二行是这么说的?…:

myApplication.beep = myApplication.beep(3);
实际上,我认为对beep的第二次调用只是返回另一个函数,但其'x'参数设置为undefined

另外:要保存一些代码编写,而不是声明然后分配“beep”,您可以编写以下代码:

myApplication.beep = function(x) { ...
或者,可以从一开始立即声明整个对象:

myApplication = {
  beep: function(x) {
  },
  otherFn: function(y) {
  }
}

我想问题在于我需要的是:myApplication.beep=beep(),而不是myApplication.beep=beep。