Я постараюсь сделать это "немного" более теоретическим, не вдаваясь слишком глубоко в документацию и т. Д.
Основной ответ на ваш вопрос можно найти, перенеся ваш код в обычный javascript. Для этого вы можете использовать babel онлайн или машинописную онлайн-площадку.
В любом случае переданный код будет выглядеть так:
"use strict";
var sum = /** @class */ (function () {
function sum() {
}
sum.prototype.add = function (x, amt) {
if (amt == 0)
return x;
return add(x + 1, amt - 1);
};
return sum;
}());
var summer = new sum();
console.log(summer.add(5, 5));
Как видите, метод add
принадлежит прототипу sum , который является функцией . Следовательно, вы можете догадаться, что доступ к add
в области действия add
просто не может неявно привести к вызову функции sum.prototype.add
.
Иными словами, если вы посмотрите на правильный код:
class sum {
add(x, amt) {
if(amt == 0) return x
return this.add(x+1, amt-1)
}
}
var summer = new sum()
console.log(summer.add(5,5))
Вы увидите, что переданный код будет вызывать метод this
:
"use strict";
var sum = /** @class */ (function () {
function sum() {
}
sum.prototype.add = function (x, amt) {
if (amt == 0)
return x;
return this.add(x + 1, amt - 1);
};
return sum;
}());
var summer = new sum();
console.log(summer.add(5, 5));
Это на самом деле не значит быть двусмысленным , скорее, в javascript такой вызов разрешен, потому что метод add
неявно доступен из глобальной области видимости. Возможность доступа к глобальной области действия в вашей области действия функции (потому что помните, что, что бы ни случилось, class
в javascript всегда передается функции) позволяет наследовать стандартное поведение функции, которое иметь доступ к своему родителю, иметь собственную область видимости и предоставлять доступ к глобальной области видимости.
Небольшое любопытство: если бы вы на самом деле могли получить доступ к this.add
, используя add
, вы бы не смогли использовать undefined
, так как это глобальная переменная , следовательно, вы бы не стали возможность получить к нему доступ и использовать его, потому что он неявно будет this.undefined
.
Итак, еще раз, это не о неоднозначности, это о том, как работает javascript functions .