2013-11-20 4 views
1

У меня есть код и он делает следующийФункция ошибка области видимости в JavaScript

var Device = function(temp){ 
    this.list = temp; 

    Device.prototype.getList = function(){ 
     return list; 
    }; 

    Device.prototype.foo = function(tempFunc){ 
     navigator.geolocation.watchPosition( 
    function(pos) { 
       //I want to call getList here so lets do it 
       //Method No1 
       var list = this.getList(); 
       //Method No2 
       var list = Device.prototype.getList(); 
       //Method No3 
       var list = getList.call(Device) 
      }, 
      funciton(){ 
       console.log("Error") 
      }       
    }; 
}; 

Во всех трех методах я получаю сообщение об ошибке. 1.объект [объект global] не имеет метода, называемого get list. 2. список не определен 3. Невозможно вызвать неопределенный.

Я также попытался вызвать метод foo в этом контексте, тогда pos не распознается в контексте, и передача getList в качестве аргумента мне тоже не помогла. Я думаю, что у меня есть понимание проблемы здесь, но я не знаю, как с этим справиться. Мне нужен метод getList, который вызывается в анонимной функции, но эта функция вызывается в глобальном контексте, это мое мышление. Может ли кто-нибудь разобраться в этом.

ответ

3

Во-первых, обычно не рекомендуется создавать свойства прототипа внутри функция-конструктор.

function Device(temp) { 
    this.list = temp; 
} 

Ваша функция «GetList» имеет явно получить свойство «список» объекта приемника (величина this):

Device.prototype.getList = function() { 
    return this.list; 
} 

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

Device.prototype.foo = function(tempFunc){ 
    navigator.geolocation.watchPosition( 
     function(pos) { 
     var list = this.getList(); 
     // ... whatever ... 
     }.bind(this), // <-- the important part 
     function(){ 
     console.log("Error") 
     } 
    );      
}; 

.bind() функция даст вам функцию, которая получила this заранее договориться д.

+0

Вы ангел .. :) Я читал о bind по какой-то причине, я не понимаю терминологию java-script, независимо от того, насколько я читаю .. Большое спасибо ... – Tharanga

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