Что происходит в вашем коде:
Вы связали функцию с объектом привет, который, в свою очередь, возвращает другую функцию, которая выводит что-то. Внешняя функция говорит действует как замыкание на внутреннюю функцию. Здесь javascript ведет себя по-другому, потому что он компилирует код. Внутренняя функция не распознает эту переменную и скорее выберет глобальное this.name.
Чтобы решить эту проблему, вам придется сделать это:
var hello = {
name: "Vishal",
speak: function(to){
//we tell this closure that this is to be taken from function scope and no the global scope
var self = this;
return function(){
console.log(self.name+" says hello "+to);
}();
}
}
hello.speak("Vinay");
Понимание Прецедент связывают
Bind:
Создает копию функции, с которой связывают называется , Затем вы можете передать объект или область действия, которую вы хотите связать с этим ключевым словом.
Пример:
var hello = {
name: "Vishal",
speak: function(to){
return function(){
console.log(this.name+" says hello "+to);
};
}
}
var speakTo = hello.speak("Vinay");
var speakToCall = speakTo.bind(hello); //will give you the desired output.
speakToCall();
Теперь, это не реальное использование случай привязки, звоните или применить. Это было просто показать вам, как ваша функциональность может быть достигнута с помощью bind.
Реальный вариант использования может быть что-то вроде этого:
Use Case:
When you have multiple objects like:
var a = {
firstname: "rahul",
lastname: "arora",
getFullName: function(){
return this.firstname + ' ' + this.lastname;
}
}
//Another object with same properties but without the function
var b = {
firstname: "Micheal",
lastname: "Angelo",
}
//Rather than defining that function again in the object 'b' you can use bind, call or apply to get the desired output.
console.log(a.getFullName.call(b)); // will output Micheal Angelo which is associated to b
Я надеюсь, что это помогает.
Почему вы возвращаете результат другой функции, а не просто вызываете 'console.log' непосредственно в' speak'? В этом случае это будет работать. Проблема в том, что внутренняя функция вызывается с другим контекстом ('this'). –
@ user3666112 use hello.name вместо –
Я просто хочу понять использование вызова, и это своего рода требование, а вместо console.log вы можете рассмотреть другое возвращение здесь. – user3666112