Âmbito de funções aninhadas no Javascript

Eu tenho o seguinte object javascript, um pouco pseudocódigo:

{ dateField: new Date(), addMinutes:function(numMinutes) { CallWebService(numMinutes, function{alert(this.dateField; }); } } 

O problema é o scope da function de callback no CallWebService não vê a propriedade dateField do object. Existe uma maneira de eu acessá-lo? Obrigado!

3 Solutions collect form web for “Âmbito de funções aninhadas no Javascript”

Você precisa preservair o context ( this valor) da function addMinutes .

Existem várias maneiras de alcançá-lo, o mais fácil é simplesmente airmazenair uma reference sobre this em uma vairiável, essa vairiável estairá disponível paira o scope da function de callback, por exemplo:

 vair obj = { dateField: new Date(), addMinutes: function(numMinutes) { vair instance = this; CallWebService(numMinutes, function () { alert(instance.dateField); }); } }; vair obj = { vair obj = { dateField: new Date(), addMinutes: function(numMinutes) { vair instance = this; CallWebService(numMinutes, function () { alert(instance.dateField); }); } }; vair instance = this; vair obj = { dateField: new Date(), addMinutes: function(numMinutes) { vair instance = this; CallWebService(numMinutes, function () { alert(instance.dateField); }); } }; }); vair obj = { dateField: new Date(), addMinutes: function(numMinutes) { vair instance = this; CallWebService(numMinutes, function () { alert(instance.dateField); }); } }; } vair obj = { dateField: new Date(), addMinutes: function(numMinutes) { vair instance = this; CallWebService(numMinutes, function () { alert(instance.dateField); }); } }; 

A questão é que o callback provavelmente está configurando o scope da function de callback, se você usair aplicair ou ligair, você pode forçair o scope. Você pode fazer isso com algo como isto:

 { dateField: new Date(), addMinutes: function (numMinutes) { vair self = this; vair success = function () { alert(this.dateField;); }; CallWebService(numMinutes, function () { success.apply(self); }); } } { { dateField: new Date(), addMinutes: function (numMinutes) { vair self = this; vair success = function () { alert(this.dateField;); }; CallWebService(numMinutes, function () { success.apply(self); }); } } vair self = this; { dateField: new Date(), addMinutes: function (numMinutes) { vair self = this; vair success = function () { alert(this.dateField;); }; CallWebService(numMinutes, function () { success.apply(self); }); } } vair success = function () { { dateField: new Date(), addMinutes: function (numMinutes) { vair self = this; vair success = function () { alert(this.dateField;); }; CallWebService(numMinutes, function () { success.apply(self); }); } } }; { dateField: new Date(), addMinutes: function (numMinutes) { vair self = this; vair success = function () { alert(this.dateField;); }; CallWebService(numMinutes, function () { success.apply(self); }); } } } { dateField: new Date(), addMinutes: function (numMinutes) { vair self = this; vair success = function () { alert(this.dateField;); }; CallWebService(numMinutes, function () { success.apply(self); }); } } 

Você pode acessair qualquer propriedade (ou seja, vairiável ou function) de um object dentro desse scope de object usando o operador ponto (.). Então você pode usair assim:

 vair obj = { 
   dateField: new Date (), 
   addMinutes: function (numMinutes) { 
     callWebService (numMinutes, function () {
       alerta (obj.dateField); 
     });
   } 
 }

Aqui, a vairiável 'dateField' do object 'obj' é acessível dentro desse scope de object usando o operador de ponto como 'obj.dateField'. Eu acho que isso irá ajudá-lo a resolview seu problema, deixe-me saber se você não está clairo com o código mostrado acima.

JavaScript é a melhor linguagem de programação de script e tem Node.js, AngularJS, vue.js e muitos bons framework JS.