2016-06-22 2 views
0

Я пытаюсь понять функции JavaScript. просто хотел узнать, как значение console.log(go()); возвращает 6?Функция JavaScript в объекте

var x = 10; 
var foo = { 
    x: 2, 
    baz: { 
     x : 1, 
     bar: function() { 
      return this.x + 1; 
     } 
    } 
}  
var go = foo.baz.bar  
console.log(go()); //returns 6 
console.log(foo.baz.bar()); //returns 2 

Может ли кто-нибудь просить меня объяснить, как его возвращение 6?

+1

В моем браузере 'go()' возвращает 'NaN'. В какой среде вы тестируете? – Sirko

+1

вы не присвоили значение ** x **, которое впервые ** не определено **, поэтому оно вернет ** NaN не 6 **. повторите попытку. –

+0

это вернет 6, только у вас есть контекст, где x имеет значение, равное 5, в вашем примере вы должны где-то определить глобальную переменную x = 5 –

ответ

2

console.log (foo.baz.bar()); будет возвращает 2 после запуска код ниже:

var foo = { 
    x: 2, 
    baz: { 
     x : 1, 
     bar: function() { 
      return this.x + 1; 
     } 
    } 
}  
var go = foo.baz.bar  
console.log(foo.baz.bar()); //returns 2 

Но console.log (Go()); возвращает Nan в браузере Firefox.

+0

я извиняюсь за это, это была проблема с кешем для меня раньше. – Sarav

3

это в функции Javascript представляет разные объекты, когда функция вызывается по-разному.

Когда вы пишете foo.baz.bar(), это представляет последний объект в объекте вызывающей цепочке, то есть Баз объект.

Однако, в следующем коде, это не представляет БАЗА объекта как вызов конечной функции не используется БАЗА объекта. Он принадлежит глобальному объекту.

var go = foo.baz.bar 
go(); 

Где-то в коде, х является глобальным объектом оценивается как 5, следовательно, this.x + 1 будет возвращать 6.

1

Это связано с контекстом и объема this для обеих этих функций звонки. В первом случае:

var go = foo.baz.bar; 
go(); 

Мы просто сделать go быть функция, которая foo.baz.bar есть, хотя это только что функция. Вы можете думать об этом, как только:

function() { 
    return this.x + 1; 
} 

Из-за этого this имеет в виду Window, который использует глобальную переменную x для this.x. Конец: 5, что дает результат 6.

Во втором случае мы действительно в рамках foo.baz, когда мы доступ к функции:

foo.baz.bar() 

В этом случае this.x относится к x, определенной в foo.baz, который является 1, что дает результат 2.

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