2013-11-12 4 views
3

Дано:Играя с "это" в Javascript

var q = {}; 
    q.id = 1234; 
    q.bonus = { 
     'a':{ 
      'b':(function(){ 
       //i want to access q.id 
       var id = this. ??? .id 
      }), 
     } 
    }; 

Что должно быть ??? для доступа к q.id.

+3

Просто используйте q.id, это не сработает – bfavaretto

+3

Нет встроенного «родительского указателя». Если вы хотите, чтобы встроенный объект 'a' мог ссылаться на' q', вы должны его явно указать: ''a': {'parent': q,' ... –

+3

Или используйте '.bind (q) ' –

ответ

6

Чтобы получить доступ к q.id в функции, связанной с b использования Function.prototype.bind

var q = {}; 
q.id = 1234; 
q.bonus = { 
    'a':{ 
    'b': (function(){ 
     //i want to access q.id 
     var id = this.id; 
     console.log(id); 
    }).bind(q), 
    } 
}; 

q.bonus.a.b(); 

Вы также можете использовать Function.prototype.call изменить контекст this

q.bonus.a.b.call(q); 
+1

Вы также можете использовать функцию * call *, я считаю. – LiavK

+1

Интересный побочный эффект, вы не можете использовать 'call' на связанной функции. Ну, вы можете, но он не будет делать то, что вы хотите ... –

1

Вы можете использовать вызов или применить, чтобы изменить " это значение.

var q = {}; 
q.id = 1234; 
q.bonus = { 
    'a':{ 
     'b':(function(){ 
      //i want to access q.id 
      var id = this.id 
     }.call(q)), 
    } 
}; 
+3

Это вызывает функцию немедленно – Bulkan

1

Как вы можете видеть из других ответов и комментариев, любое решение включает в себя ссылку на q по имени. Поэтому я бы просто использовал q.id.

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