javascript:将函数分配给变量会用未定义填充变量



这有点基本,但它让我有些头疼:

我正在为变量分配一个函数,然后从变量中调用第一个函数中的函数。

当我将函数分配给变量时,它填充了未定义,因此当我调用内部函数时,我收到错误:

捕获的类型错误:无法读取未定义的属性"添加">

这是我正在处理的代码:

(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的情况下s1s2中获得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());
})();

通常,构建器函数不会以大写字母开头(这基本上是为构造函数保留的(,因此它将具有类似createSumbuildSum或类似名称的名称。

该版本的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
}());

最新更新