2017-01-25 3 views
0

Я пытаюсь понять, как ключевое слово this работает в JS, особенно то, что именно представляет собой ключевое слово this, когда вы используете его внутри класса, но не внутри каких-либо вложенных функций. Пожалуйста, помогите мне понять, почему я получаю сообщение об ошибке, когда я изменяю этот первый параграф кода ко второму абзацу кода.Значение этого ключевого слова внутри класса

console.log(this); 
    constructor() { 
    console.log(this); 
    } 
} 
var tiger = new Animal(); 

Этот выход будет: Window {} and Animal {} как я хочу, в консоли.

console.log(this); 
class Animal { 
    var that = this; // addition 
    constructor() { 
    console.log(this); 
    } 
} 
var tiger = new Animal(); 
console.log(tiger.that) // addition 

Это выведет Uncaught SyntaxError: Unexpected identifier в консоль. Я считаю, причина этой ошибки, это линия var that = this;, но я не понимаю, почему, я предположил, переменная that будет равна Window {} or Animal {}.

+0

Ваш синтаксис неверен, вам нужно переместить 'var that' внутри вашего' constructor() ' –

+0

Я предполагаю, что вы получаете ошибку на' console.log (tiger.that) ', потому что' var that = this; 'не отображается вне класса. –

+0

@Mr. Alien Дело в том, что я не хочу переместить его в вложенный метод, например, в конструктор. Я хотел посмотреть, что такое 'this' ссылается, когда снаружи метода, но все еще внутри класса. – Arshaan

ответ

-1

Во втором примере that является локальной переменной в диапазоне class Animal. Когда вы объявляете переменную с ключевым словом var, она объявляется только в текущей области. Он не определен в любом коде вне этого класса.

Дополнительную информацию см. В статье MSDN по адресу Variable Scope in Javascript.

+0

Спасибо, это был ответ, который мне нужен. Я не полностью понял правила языка. Я предположил, что если бы я создал экземпляр класса, а затем попытался получить доступ к свойству, я мог бы его отобразить. – Arshaan

+1

Это недопустимый синтаксис, scope не имеет к этому никакого отношения. Вы не можете объявлять переменные внутри класса –

-1

Вам необходимо переместить var that = this; на номер constructor(). Вы не можете объявить class конкретных свойств за пределами метода.

console.log(this); 
class Animal { 
    constructor() { 
    var that = this; // addition 
    console.log(this); 
    } 
} 
var tiger = new Animal(); 
console.log(tiger.that) // addition 
+0

или (что он, скорее всего, пожелал): 'this.that = this;' иначе 'that' видна только внутри конструктора (или должна быть) –

+0

Это то, что я неправильно понял при написании вопроса , "Вы не можете объявлять свойства класса, отличные от метода." Спасибо за объяснение. – Arshaan

0

То, что вы пробовали, является недопустимым синтаксисом. Проверьте the MDN docs для справки.

+0

Обратите внимание, что ссылки только для ответов [не рекомендуется на stackoverflow] (https://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers). Пожалуйста, объясните * почему * это недопустимый синтаксис в ваших собственных словах и как его можно было бы установить как правильный синтаксис. – Philipp

+0

@Philipp Я понимаю вашу точку зрения и согласен, но не в этот раз. Это была 1 строка кода, которая была неуместна и имела довольно семантическую ошибку. Это не ответ со ссылкой, подразумевающей «Эй, взгляните на всю документацию по Javascript», это ссылка на явную документацию по документации, показывающую правильный синтаксис выражения класса, и если вопрос мужественный о синтаксисе, просто указывая в сжатую документацию по документации является действительным ответом (или, по крайней мере, если бы я был тем, кто спрашивал). – GMaiolo

Смежные вопросы