2016-06-22 6 views
6

Есть this в области значений в списке параметров метода в TypeScript?Может ли `this` использоваться при указании значения по умолчанию в машинописном тексте?

Рассмотрим following code:

class Foo { 
    constructor(public name) {} 
    bar(str: string = this.name) { console.log(str); } 
} 

let f = new Foo("Yo"); 
f.bar(); 

Значение по умолчанию str задается с помощью this, даже если мы не в теле метода экземпляра.

В настоящее время (в машинописи 1.8) это работает, так как он transpiled к:

Foo.prototype.bar = function (str) { 
    if (str === void 0) { str = this.name; } 
    console.log(str); 
}; 

Так this используется внутри метод, но это указанный быть законным?

Я не мог найти ответ на этот вопрос с беглым взглядом на specification.

Примечание: Это не является законным в C++, что делает меня вопрос, является ли это намеренная функцией или просто артефакт процесса transpilation.

ответ

4

В разделе 8.3.1 Constructor Parameters указано, что использование в конструктор выражение параметра по умолчанию является ошибкой.

В разделе 8.4.2 Member Function Declarations не упоминается об ошибках использования this в выражениях по умолчанию в обычных методах класса (неконструкторы).

Раздел 6.6 Code Generation наконец объясняет, что код генерируется в виде:

if (<Parameter> === void 0) { <Parameter> = <Default>; } 

Где Параметр имя параметра и по умолчанию является выражением значения по умолчанию.

Другими словами, текущая спецификация явно позволяет использовать this в выражениях значения по умолчанию параметра, за исключением конструктора.

Ваш код действителен в соответствии со спецификацией.

4

Да. Он действителен в соответствии с EcmaScript 6 specification, и транспилер TypeScript должен рассматривать его как таковой.

Поскольку аргументы по умолчанию оцениваются во время разговора, вы даже можете использовать вызовы методов и другие аргументы в значении по умолчанию.

+3

Знаете ли вы, где находится спецификация es6? – Alex

+0

[Здесь] (http://www.ecma-international.org/ecma-262/6.0/#sec-function-definitions) в спецификациях. Кроме того, дается хороший обзор [https://developer.mozilla.org/cs/docs/Web/JavaScript/Reference/Functions/Default_parameters), указывая, что аргументы по умолчанию оцениваются во время разговора. –