【发布时间】:2019-11-15 00:01:07
【问题描述】:
我很好奇为什么方法不能在 javascript 中调用其他方法或它们自己。例如,这会产生一个引用错误,说明 add is not defined。
class sum {
add(x, amt) {
if(amt == 0) return x
return add(x+1, amt-1)
}
}
summer = new sum()
console.log(summer.add(5,5))
您必须改用 this.add()。
现在我知道方法会被转换为原型上的函数,但我不明白这如何解释我指出的这个限制?
在定义 add 时,它可能引用自身或其他带有闭包捕获的方法,这不是一个原因。
为什么会这样?
【问题讨论】:
-
你必须来自Java....(另外,
add不是类方法,它是实例方法) -
如果您有一个返回
a-b的全局add函数并想使用它,该怎么办? jsfiddle.net/gh97ynt3 之所以这样,是因为global变量在 javascript 中的工作方式。 -
因为这就是语言的定义方式,句号。规则与其他语言不同。
-
对象方法呢?
{ foo() { bar() }, bar() {} }?如果决定遵循您的规则的权力,他们要么必须使对象方法与类方法工作相同(以保持一致性),但对象方法和对象函数属性({foo: function() {}})中的范围规则将不一致,或者他们会不理会对象,并且在对象和类方法之间存在不一致。通过使方法(大部分)像任何其他函数一样工作,它们可以避免这种混淆。 -
一般来说,很少有“硬”的理由说明必须以某种方式完成某事。大多数设计决策都是权衡取舍,并且任何因素都可能影响该决策(易于实施、设计一致性、最小意外原则、历史背景、其他语言的优先级、向后兼容性等)。
标签: javascript ecmascript-6 ecmascript-2017