2016-07-03 2 views
1
var hello = { 
    name: "Vishal", 
    speak: function(to){ 
     return function(){ 
      console.log(this.name+" says hello "+to); 
     }(); 
    } 
} 

Я называю эту функцию, -Как сделать имя доступны в этом коде

hello.speak("Vinay"); 

Фактический выход является

says hello to Vinay

Ожидаемый выход

Vishal says hello to Vinay

Я знаю, что hello.name разрешит это, но как его решить, используя this, так что с помощью метода call или apply или bind это может быть разрешено.

+3

Почему вы возвращаете результат другой функции, а не просто вызываете 'console.log' непосредственно в' speak'? В этом случае это будет работать. Проблема в том, что внутренняя функция вызывается с другим контекстом ('this'). –

+0

@ user3666112 use hello.name вместо –

+0

Я просто хочу понять использование вызова, и это своего рода требование, а вместо console.log вы можете рассмотреть другое возвращение здесь. – user3666112

ответ

2

Что происходит в вашем коде:

Вы связали функцию с объектом привет, который, в свою очередь, возвращает другую функцию, которая выводит что-то. Внешняя функция говорит действует как замыкание на внутреннюю функцию. Здесь 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 

Я надеюсь, что это помогает.

+0

Спасибо @Rahul, это работает, и я понимаю, что часть этого будет исследовать больше, чтобы полностью понять это. – user3666112

+0

Альтернативно: 'return function() {...} .bind (this);' для сохранения вызова '.bind()' от пользователя. –

+0

Спасибо @ Rahul, что вы очень помогаете мне понять эту вещь, я пытался что-то не так работать, что вы мне поняли. Большое спасибо сэр .. – user3666112

4

hello доступен внутри себя.

var hello = { 
 
    name: "Vishal", 
 
    speak: function(to){ 
 
     return function(){ 
 
      console.log(hello.name+" says hello "+to); 
 
     }(); 
 
    } 
 
} 
 

 
hello.speak("Vinay");

+0

спасибо за ваш ответ, но мой друг должен сделать его доступным, используя метод вызова, привязки или применения, как-то, и сохранить this.name там. – user3666112

+0

Не уверен, что hello доступен сам по себе, является правильной терминологией, хотя ... Это доступно, поскольку это глобальная переменная – Nishant

0

Когда вы hello.speak, то this будет стать hello объектом. Следовательно, this.name уже Vishal.

var hello = { 
    name: "Vishal", 
    speak: function(to){console.log(this.name + " says hello " + to)} 
    } 
} 


hello.speak("Vinay"); 

Если вы действительно хотите сделать это так, как вы просили в этом вопросе, вы можете сделать это:

var hello = { 
    name: "Vishal", 
    speak: function(to){ 
     var self = this; 
     return function(self){ 
      console.log(self.name + " says hello to " + to); 
     }(self); 
    } 
} 

Вы также можете пропустить прохождение self потому что lexical обзорное позволяет получить доступ к этому.

Но изобразите, что вы делаете. У вас есть Object hello, который имеет name и метод speak. speak уже имеет доступ к hello, когда вы вызываете его как hello.speak через магическую переменную . Так что все, что вы хотите сделать, можно сделать там.

Вы снова создавая function в чьи обязанности входит только доступ hello.name и переменная поставляется в качестве аргумента, который уже можно сделать speak, но это просто накладные расходы.

мне его немного, как:

a = function(){(function(){console.log("Hi")})()} 

когда

a=function(){console.log("Hi")} 

будет достаточно.

По возможности сделайте код простым, точным и точным. Сложные коды не лучше, но на самом деле все наоборот. Опять же, я не уверен, что вы делаете, но это общий принцип.

+0

спасибо за ваш ответ, но у меня есть такое требование. – user3666112

+0

, тогда вы можете отправить полное требование, для этого простого случая использования это не требуется. – Nishant

+0

Сэр несколько раз вы не можете публиковать фактические требования из-за корпоративных ограничений, но это несколько сценарий. – user3666112

0

Так как в этом случае «имя» переменная является константой я думаю, что вы можете использовать прямой подход и сделать:

var hello = { 
name: "Vishal", 
speak: function(to){ 
    return function(){ 
     console.log(hello.name+" says hello "+to); 
     }(); 
    } 
} 

Или вы можете угробить функцию возврата и сделать это непосредственно с помощью «это»

var hello = { 
name: "Vishal", 
speak: function(to){ 
     console.log(this.name+" says hello "+to); 
    } 
} 

Надеется, что она удовлетворяет как ваш ответ

+0

Привет @shrikanth спасибо за ваш ответ, но разве невозможно разрешить его каким-то образом использовать метод вызова или привязки или применения? или есть что-то серьезно неправильное в понимании там реального использования? – user3666112

+0

Метод вызова или применения используется для вызова функции. Я не знаю, как это может быть полезно в этом сценарии:/ –

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