这类似于我今天提出的另外两个问题,但我仍然试图了解如何在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; 我认为我必须通过原型或其他方式分配它。
答案 0 :(得分: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
的第一个参数,因此3
然后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);
我会过早地避免搞乱关闭。
答案 1 :(得分:1)
第一次调用beep(3)时,它返回一个函数 - 但你实际上并没有对该函数做任何事情。我想你可能在倒数第二行意味着这个?...:
myApplication.beep = myApplication.beep(3);
实际上,我认为第二次调用beep只是返回另一个函数,但是它的'x'参数设置为undefined。
另外:为了保存一些代码写入,而不是声明然后分配'beep',你可以这样写:
myApplication.beep = function(x) { ...
或者,整个对象可以从头开始声明:
myApplication = {
beep: function(x) {
},
otherFn: function(y) {
}
}