Разница между nameFunction() {} и nameFunction() => {} в ECMA6
Я начинаю изучать синтаксис Vue.js и ECMA6, я видел это в учебнике:
methods: {
someMethod: function() {
console.log(this) // this works
}
}
Тогда я подумал, что синтаксис может быть:
methods: {
someMethod: () => {
console.log(this) // this undefined
}
}
но это работает:
methods: {
someMethod () {
console.log(this) // this works
}
}
Можно объяснить разницу и синтаксис ECMA5?
Ответы
Ответ 1
Из трех возможных вариантов в ES5 поддерживается только первая. Остальные два являются дополнениями в ES6.
Третий вариант - это ярлык ES6 для первого варианта, и поэтому они работают одинаково в ES6.
Когда вы используете синтаксис стрелки, как во втором, this
НЕ установлен как хост-объект, так как он находится в первом и третьем. Эта одна из особенностей синтаксиса стрелки и, следовательно, ее не следует использовать, если вы ожидаете, что this
будет установлен на объект-хост. Вместо этого this
будет установлен в лексический контекст, из которого был определен код, который часто упоминается как "значение this
в охватывающем контексте" или "лексическое значение этого", которое в вашем случае было бы любым this
был, когда первоначально был объявлен объект-хост, который, по-видимому, был undefined
.
Здесь хорошая справочная статья о функциях стрелок: ES6 В глубине: функции стрелок
Ответ 2
- Объектные методы, у которых есть метод someMethod. В этом случае этот представляет собой ссылку на объект методы.
- Объект методы, который имеет свойство someMethod, в котором хранится некоторая анонимная функция. В этой функции этот есть undefined, потому что функция анонимна.
- Объектные методы имеют внутреннюю функцию someMethod. В этой функции этот ссылается на методы, потому что внутренняя именованная функция (не анонимная или внешняя) этого объекта.
Удачи!
+ Попробуйте этот путь
var methods1 = function() {
var self = {
someMethod: function() {
console.log(self);
}
};
return self;
}();
var methods2 = function() {
var self = {
someMethod: () => {
console.log(self);
}
};
return self;
}();
var methods3 = function() {
function someOtherMethod() {
console.log(self);
}
var self = {
someMethod: function() {
someOtherMethod();
}
}
return self;
}();
methods1.someMethod();
methods2.someMethod();
methods3.someMethod();