2016-10-31 2 views
-1

я начать обучение ES6 & написал этот код:Почему этот код всегда не задан?

let dog = { 
 
     s:'Woff', 
 
     talk:()=>{console.log(this.s)} 
 
    }; 
 
    dog.talk(); 
 
    let x = dog.talk; 
 
    x(); 
 
    x.bind(dog)();

почему она всегда возвращает неопределенное вместо 'Woff'? Я думаю, что только одна строка возвращает undefined, но у нас есть 3 undefined.

+1

console.log возвращает undefined. –

+0

1. У вас нет каких-либо операторов 'return' и 2. you' console.log (console.log (...)) ' – crashmstr

+0

@JaredSmith Только что проверили документы, а так как он имеет' {} ' (тело блока) ему нужно вернуть, насколько я могу судить: [Функции стрелки] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions) – crashmstr

ответ

6

Вы определили значение свойства «говорить» как функцию стрелки, что означает, что значение this в этой функции будет независимо от значения this в контексте определения функции. Это не объект «собака», это то, что this - это то, что отображается let.

Если вы используете обычную функцию вместо этого, ваш код будет работать, как вы ожидаете:

let dog = { 
    s:'Woff', 
    talk: function(){ console.log(this.s); } 
}; 
console.log(dog.talk()); 

Теперь на вершине this проблемы, ваша функция «говорить» ничего не вернуть, так прохождения результаты вызова функции всегда будут возвращаться undefined. (В версии функции со стрелкой был, возможно, это было возвращаемое значение, если бы это было тело без функции без брекета, но оно было бы также было undefined, потому чтоничего не возвращает.) Итак:

let dog = { 
    s:'Woff', 
    talk: function(){ console.log(this.s); return this.s; } 
}; 
console.log(dog.talk()); 

Теперь вы увидите «Woff» из console.log() в функции, а также от внешнего console.log().

+0

Я все еще не думаю, что это совершенно правильно. 'console.log' не возвращает значение. Он выводит строку и, следовательно, ничего не возвращает. Следовательно, вывод возвращаемого значения 'console.log' приведет к' undefined'. – Brandon

+0

@Brandon да, согласен; Мне нужно было выяснить, как я хотел бы объяснить это :) Ответ обновлен. – Pointy

+1

Функция стрелок с '{}' нужна инструкция 'return'.Он используется только автоматически, когда вы используете версию с одним оператором. –

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