我正在定义一个非常简单的对象,它应该计算数字1和1的总和。 2:
function Calculator() {
this.number1 = 0;
this.number2 = 0;
this.sum = function() {
return this.number1 + this.number2;
}
}
var calculator = new Calculator();
calculator.number1 = 1;
calculator.number2 = 2;
console.log(calculator.sum);
然而,当我运行“sum”方法时,控制台返回:
function() {
return this.number1 + this.number2;
}
这就像我的方法被认为是一个字符串,但我不明白为什么......
答案 0 :(得分:6)
console.log(calculator.sum());
您的方法不被视为字符串。会发生什么是calculator.sum
是一个包含函数的变量。无需调用即可记录它只会返回它的主体。
答案 1 :(得分:1)
首先,不“被视为”字符串:sum
被视为功能。但是,因为您试图“转储”函数引用,并且您只能转储文本,JavaScript需要询问该对象的字符串表示形式。并且该对象的字符串表示是函数的源。所以基本上有:
console.log(calculator.sum);
拥有:
是一样的console.log(calculator.sum.toString());
那是因为log
需要转储字符串并尝试将参数转换为可以显示的内容。另请注意,此行为取决于您正在使用的控制台。例如,Firefox的Web控制台返回[object Function]
(因为它使用Object.prototype.toString
而不是函数的一个),其中Chrome Web控制台返回函数的toString
方法。
在您的情况下,您可能想要调用该方法,因此您忘记了括号:
console.log(calculator.sum());
但是,原因是当您尝试在没有括号的情况下记录calculator.sum
时没有出现任何错误,这是因为JavaScript有first-class function。这是一个非常强大的功能,它使您能够将函数作为其他函数的参数传递,就像您所做的那样。例如,你可以:
function log(thing) {
console.log(Object.prototype.toString.call(thing));
}
log(1);
log("something");
log(function foo() {});
当然你也可以调用一个作为参数传递的函数:
function say(something) {
alert(something());
}
function hello() { return "Hello!" };
function bye() { return "Bye!" };
say(hello);
say(bye);
这些只是愚蠢的例子,但只是为了给你一个想法。