这有点基本,但它让我有些头疼:
我正在为变量分配一个函数,然后从变量中调用第一个函数中的函数。
当我将函数分配给变量时,它填充了未定义,因此当我调用内部函数时,我收到错误:
未捕获的类型错误:无法读取未定义的属性"添加">
这是我正在处理的代码:
(function () {
function Sum() {
this.result = 0;
this.getCurrentSum = function getCurrentSum() {
return this.result;
}
this.add = function add(add_number) {
this.result += add_number;
}
}
var s1 = Sum(); // here s1 is undefined
var s2 = Sum(); // here s2 is undefined
s1.add(10); // here cannot execute add of undefined crash
s1.add(20);
s2.add(30);
s2.add(5);
// must print 30
console.log(s1.getCurrentSum());
// must print 35
console.log(s2.getCurrentSum());
}());
我可以更改 Sum 函数中的代码,但无法更改代码的其余
部分看起来您希望Sum
成为一个构造函数。您可以通过new
调用构造函数,而不是直接调用。所以:
var s1 = new Sum();
var s2 = new Sum();
您在没有new
的情况下s1
和s2
中获得undefined
的原因是Sum
在任何地方都不会return x
,因此调用它的结果是值undefined
。但是当你使用new
时,new
表达式的结果是创建的对象。
FWIW,Sum
还有另一个问题:您在几个地方错过了this.
(还有几个分号,尽管自动分号插入会为您添加它们(:
function Sum() {
this.result = 0;
this.getCurrentSum = function getCurrentSum() {
return this.result;
// −−−−−−−−^^^^^
};
this.add = function add(add_number) {
this.result += add_number;
// −^^^^^
};
}
JavaScript 不像 Java 或 C#,this.
也不是可选的。
在评论中,您问:
wat 如果我可以更改 Sum 函数或函数内的任何内容,但我无法更改 var s1 = Sum((;叫?
在这种情况下,您将Sum
构建器函数并让它返回一个对象,如下所示:
function Sum() {
return {
result: 0,
getCurrentSum: function getCurrentSum() {
return this.result;
},
add: function add(add_number) {
this.result += add_number;
}
};
}
现场示例:
(function () {
function Sum() {
return {
result: 0,
getCurrentSum: function getCurrentSum() {
return this.result;
},
add: function add(add_number) {
this.result += add_number;
}
};
}
var s1 = Sum(); // here s1 is undefined
var s2 = Sum(); // here s2 is undefined
s1.add(10); // here cannot execute add of undefined crash
s1.add(20);
s2.add(30);
s2.add(5);
// must print 30
console.log(s1.getCurrentSum());
// must print 35
console.log(s2.getCurrentSum());
})();
通常,构建器函数不会以大写字母开头(这基本上是为构造函数保留的(,因此它将具有类似createSum
或buildSum
或类似名称的名称。
该版本的Sum
是用 ES5 级别的语法编写的(实际上它甚至是 ES3 级别的语法(。在ES2015+中,它可以更简洁一些:
// ES2015+ using method syntax
function Sum() {
return {
result: 0,
getCurrentSum() {
return this.result;
},
add(add_number) {
this.result += add_number;
}
};
}
现场示例:
(function () {
// ES2015+ using method syntax
function Sum() {
return {
result: 0,
getCurrentSum() {
return this.result;
},
add(add_number) {
this.result += add_number;
}
};
}
var s1 = Sum(); // here s1 is undefined
var s2 = Sum(); // here s2 is undefined
s1.add(10); // here cannot execute add of undefined crash
s1.add(20);
s2.add(30);
s2.add(5);
// must print 30
console.log(s1.getCurrentSum());
// must print 35
console.log(s2.getCurrentSum());
})();
由于您在Sum
函数中使用this
,因此需要构造该对象的实例。使用new
运算符将Sum
用作"构造函数"将实现此目的。
但是,在Sum
中,您将this.result
声明为实例变量,因此您还必须在函数的其他位置将其引用为this.result
。
看看我的另一篇关于this
及其作用的帖子。
(function () {
function Sum() {
this.result = 0;
this.getCurrentSum = function getCurrentSum() {
return this.result;
}
this.add = function add(add_number) {
this.result += add_number;
}
}
var s1 = new Sum();
var s2 = new Sum();
s1.add(10);
s1.add(20);
s2.add(30);
s2.add(5);
console.log(s1.getCurrentSum()); // 30
console.log(s2.getCurrentSum()); // 35
}());