2013-06-02 2 views
2

Я не понимаю, как работает этот объем. Как значение eg.i может быть изменено в first, если оно изменено только в second?Объектная переменная scope javascript?

Пример

var obj = { 

    first: function() { 

     var eg = {i: 0}; // eg equals 0 here 

     obj.second(eg); 
     obj.second(eg); 

     console.log(eg.i); // 2 
    }, 

    second: function(eg) { 

     ++eg.i; 
    } 
}; 

Как eg.i модифицируются в первой функции, а?

+1

В чем вопрос? – Ven

+2

Он передан по ссылке в 'obj.second()'. –

+0

Этот ответ может немного помочь. http://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference-or-pass-by-value-language – AlexLordThorsen

ответ

2

Вы передаете eg в качестве параметра second. Было бы легче увидеть, если бы вы переименовали его:

second: function(x) { 
    ++x.i; 
} 

Он изменяется в первой функции, потому что вы изменяете его со второй функцией.

+0

Итак, все объекты передаются по ссылке? – user2251919

+0

@ user2251919: http://stackoverflow.com/questions/7744611/pass-variables-by-reference-in-javascript – Blender

+0

Спасибо @Blender – user2251919

4

Когда объекты передаются в функции в JS, они передаются в виде ссылок, а не значения: http://snook.ca/archives/javascript/javascript_pass

+0

Но не объекты передаются по значению? – user2251919

+0

Правильно. Например, если вы передаете JS-функцию строковым аргументом, то это передается как значение, а не ссылка. Представьте, что объект существует в памяти, и вся функция get является указателем на этот объект. –

+0

О'кей, статья объяснила это хорошо, короткие краткие примитивные рассказы по значению, объекты по ссылке, спасибо – user2251919

4

Как было отмечено в моем комментарии к ответу Ахмеда Нуамана, сказав, что аргумент передаются по ссылке неверно , Доказывая, что тривиально:

function change (x) { 
    //"replace" x with a different object? 
    x = { 
     a : 4 
    }; 
} 
var o = { a : 6 }; 
change(o); 
console.log(o.a); //6 

Если аргумент будет действительно был передан по ссылке, o.a бы 4. Однако аргумент передается ссылкой значение - в этом случае это просто и объект.

И вот почему вы наблюдали симптомы, представленные в вопросе: когда вы непосредственно изменили аргумент, объект, который был передан, был изменен.

Как будто у вас есть мороженое, а затем вернулся на подставку, чтобы попросить дополнительный совок ванили. У вас все еще есть та же чашка, но с этим лишним. Используя эту аналогию в приведенном выше примере, вы просите новое ванильное мороженое: у вас все еще есть старая, и это не изменилось (ну, возможно, оно немного расплавилось). В сценарии «перекрестная ссылка» вы бы сбросили свое существующее мороженое и получили новый.

В заключение: это не касается правил определения области видимости в js. Если eg не было передано функции second, оно было бы недоступно для него.

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