1 (изменено: im2002, 2013-06-01 20:12:51)

Тема: JS:передача по ссылке и по значению.

Как-то на полях форума встретил ссылки на такой скрипт. Помогите разобраться как это работает?

function f(y)
    {
        y = {a:100, b:100};        
    };
 
var y = {a:1};             // определение объекта y с параметром а со значением 1
 
f(y);                            // вызов функции 

WScript.Echo("Параметр у.а = " + y.a + "\nПараметр у.b = " + y.b);     // ??? почему 1 и undefined ???

теперь, если изменить вот так:

function f(t)
    {
        y = {a:100, b:100};        
    };
 
var y = {a:1};            // определение объекта y с параметром а со значением 1
 
f(y);                            // вызов функции 

WScript.Echo("Параметр у.а = " + y.a + "\nПараметр у.b = " + y.b);     // 100 и 100, как и "должно быть"

2

Re: JS:передача по ссылке и по значению.

Если вы из скрипта, изменив его, не понимаете "что происходит", то вам катастрофически не достаёт некоторых  знаний...
Даю наводку: изучите понятие контекста.
А в рамках контекста - передачу ссылок на переменные и объекты (+ особенность js  в этом плане), именование переменных.

P.S.:
Фраза "определение объекта y с параметром а со значением 1" неверна в корне.
Верно будет: объявление переменной "y" в текущем контексте, создание объекта со свойством "a" со значением "1", присвоение переменной "y" ссылки на этот объект.

3

Re: JS:передача по ссылке и по значению.

max7 пишет:

Фраза "определение объекта y с параметром а со значением 1" неверна в корне.
Верно будет: объявление переменной "y" в текущем контексте, создание объекта со свойством "a" со значением "1", присвоение переменной "y" ссылки на этот объект.

Полностью согласен, загрузка в память объекта и помещение ссылки на него в переменную у. собственно так и понимаю (за кособокую фразу извиняюсь . "понятие контекста" - буду смотреть... дали бы ссылку... внутри ф-ции ничего с конструкцией var не объявлялось, поэтому все переменные, объекты и т.п. "находятся" в "глобальном контексте", доступны из любого места, ссылки на переменные "примитивных" типов передаются по значению, на объекты, массивы и т.п. по ссылке, т.е. значения, изменённые  "внутри" функции, будут актуальны и после "выхода" из функции. Вполне понятно, что происходит во 2 случае, непонятно почему в первом так...

4 (изменено: max7, 2013-06-01 22:55:26)

Re: JS:передача по ссылке и по значению.

В первом случае объявлена локальная в контексте функции переменная с именем "y" (вкратце, ей присваивается значение первого аргумента при вызове функции), которая ничего общего с "глобальной" переменной с именем "y" не имеет. Ей присваивается ссылка на новый объект со свойствами "a" и "b". Эта переменная существует только в локальном контексте функции.
Во втором случае в контексте функции нет объявления переменной с именем "y", поэтому осуществляется обращение к более вышестоящему контексту, где уже есть такая переменная. Ей присваивается ссылка на новый объект.

Ссылки: http://www.google.ru/search?q=%D0%BA%D0 … javascript
Особенно: http://javascript.ru/ecma/part10 и, вообще, все статьи и учебник...

Если я правильно понял что ожидается, то должно быть так:


function f(y)
{
   y.a = 100;
   y.b = 100;        
};

var y = {a:1};

WScript.Echo("#1: у.а=" + y.a + " у.b=" + y.b);

f(y);

WScript.Echo("#2: у.а=" + y.a + " у.b=" + y.b);

или


function f(arg0)
{
   arg0.a = 100;
   arg0.b = 100;        
};

var y = {a:1};

WScript.Echo("#1: у.а=" + y.a + " у.b=" + y.b);

f(y);

WScript.Echo("#2: у.а=" + y.a + " у.b=" + y.b);

5 (изменено: max7, 2013-06-01 23:46:05)

Re: JS:передача по ссылке и по значению.

im2002 пишет:

... внутри ф-ции ничего с конструкцией var не объявлялось...

А, ну ясно.
Запись


function (x)
{ 
   ... 
   // мой код
}

почти равносильна записи


function ()
{
   var x;
   x = arguments[0];
   ... 
   // мой код
}

6 (изменено: im2002, 2013-06-02 00:01:00)

Re: JS:передача по ссылке и по значению.

Оба ваших примера никаких сомнений и возражений не вызывают, вопрос не в этом....
вот смотрите:

function f(h)
    {
       y = {a:100, b:100};        
    };

f();                         // вызываю ф-ю без всяких параметров, объект ссылка на который хранится в переменной y, не 
                              //  только "будет создан", но и доступен за пределами ф-ции, т.к. он относиться к
                              // "глобальному контексту" (объявлен без var!)

WScript.Echo(y.a + "----" + y.b);                 // увидим 100 ---- 1000

изменим:

function f(h)
    {
       var y = {a:100, b:100};        
    };

f();                         // вызываю ф-ю без всяких параметров, объект ссылка на который хранится в переменной y, 
                              // "будет создан", но НЕ доступен за пределами ф-ции, т.к. он относиться к 
                              // "локальнлму контексту" объявлен с var

WScript.Echo(y.a + "----" + y.b);                 // увидим ошибку выполнения, т.к.  никакого у здесь не существует 

как вытащить такой объект "локального контекста"?:

function f(h)
    {
      var y = {a:100, b:100}; 
      return y;       
    };

r = f();                                  // результат вызова ф-ции (а это ссылка на объект) записана в r

WScript.Echo(r.a + "----" + r.b);  // увидим 100 ---- 1000

во всех этих примерах (хоть интуитивно), но понятно как ведёт себя интерпретатор JS...

изменю в примере 1:

function f(y)                    // вот здесь НЕ ПОНЯТНО
    {
       y = {a:100, b:100};        
    };

f();             
WScript.Echo(y.a + "----" + y.b);          // выдаст ошибку      

что делает интерпретатор при выполнении вышеуказанного кода, кто знает объясните "по-пунктам" .

7

Re: JS:передача по ссылке и по значению.

im2002 пишет:

изменю в примере 1:

function f(y)                    // вот здесь НЕ ПОНЯТНО
    {
       y = {a:100, b:100};        
    };

f();             
WScript.Echo(y.a + "----" + y.b);          // выдаст ошибку      

что делает интерпретатор при выполнении вышеуказанного кода, кто знает объясните "по-пунктам" .

im2002 Напишите пожалуйста полностью Ваш непонятный пример, т.к. не совсем ясно, какой "пример 1" Вы изменяете.

8

Re: JS:передача по ссылке и по значению.

im2002 пишет:

во всех этих примерах (хоть интуитивно), но понятно как ведёт себя интерпретатор JS...

изменю в примере 1:

function f(y)                    // вот здесь НЕ ПОНЯТНО
    {
       y = {a:100, b:100};        
    };

f();             
WScript.Echo(y.a + "----" + y.b);          // выдаст ошибку      

что делает интерпретатор при выполнении вышеуказанного кода, кто знает объясните "по-пунктам" .

Вы затрагиваете очень интересные темы, которые не возможно описать в два-три предложения. Есть желание рассказать, но нет желания много печатать. Все-таки поищите хорошие учебники по языку. Хотя бы онлайн. Хотя бы на javascript.ru почитайте. Там все доходчиво.


// объявлена функция с одним аргументом
function f(y)
{
    // мы в праве сделать что-то с ЭТИМ АРГУМЕНТОМ (не переменной!)
    y = {a:100, b:100};
};

// явно вызвали функцию, но ничего не передали
// Тоже имеем право - ничего не передавать в функцию
f();

// нет переменной, получаем ошибку
WScript.Echo(y.a + "----" + y.b);

Очень хороший и показательный пример, почему надо читать учебник.

im2002 пишет:

Как-то на полях форума встретил ссылки на такой скрипт. Помогите разобраться как это работает?

function f(y)
    {
        y = {a:100, b:100};        
    };
 
var y = {a:1};             // определение объекта y с параметром а со значением 1
 
f(y);                            // вызов функции 

WScript.Echo("Параметр у.а = " + y.a + "\nПараметр у.b = " + y.b);     // ??? почему 1 и undefined ???

Есть переменная - объект y, есть функция f, которой эту переменную передали. Так как переменная - объект, то передается она по ссылке (!!!). И, предполагается, что ее (переменную) можно изменить.

Но!!! Внутри функции создается новый объект, ссылка на который назначается аргументу функции. В результате ссылка на оригинальный объект внутри функции потеряна. Так как это происходит только внутри функции и "ломается" только ссылка на внешний объект, то внешняя программа просто печатает не измененный оригинал.

Чтобы изменить свойства внешнего объекта изнутри функции используйте точечную или скобочную нотацию явно для каждого свойства объекта.

( 2 * b ) || ! ( 2 * b )

9 (изменено: max7, 2013-06-02 06:11:23)

Re: JS:передача по ссылке и по значению.

"Имена" аргументов функции объявляются локальными переменными "автоматически".
Запись


function f (a, b, c, d)
{
   // код
}

почти равносильна записи


function f ()
{
   var a = arguments[0];
   var b = arguments[1];
   var c = arguments[2];
   var d = arguments[3];

   // код
}

При вызове f(90, 91, 92, 93) в обоих вариантах будет одно и тоже, и по результату, и по исполнению.
Если вызвать f() "без параметров", ничего по исполнению не изменится, значением локально объявленных переменных "a, b, c, d" будет undefined.

=======================================================

В примере


function f(h)
    {
       y = {a:100, b:100};        
    };

f(); // вызываю ф-ю без всяких параметров, объект ссылка на который хранится в переменной y, не 
     //  только "будет создан", но и доступен за пределами ф-ции, т.к. он относиться к
     // "глобальному контексту" (объявлен без var!)

WScript.Echo(y.a + "----" + y.b);                 // увидим 100 ---- 1000

Переменная "y" в функции объявлена без ключевого слова "var", при таком объявлении она "записывается" в глобальный контекст, и соответственно доступна после вызова функции.
Эта запись почти равносильна


function f()
    {
       var h = arguments[0]; // вот оно

       y = {a:100, b:100};        
    };

f(); // вызываю ф-ю без всяких параметров, объект ссылка на который хранится в переменной y, не 
     //  только "будет создан", но и доступен за пределами ф-ции, т.к. он относиться к
     // "глобальному контексту" (объявлен без var!)

WScript.Echo(y.a + "----" + y.b);                 // увидим 100 ---- 1000

Во примере


function f(y)                    // вот здесь НЕ ПОНЯТНО
    {
       y = {a:100, b:100};        
    };

f();             
WScript.Echo(y.a + "----" + y.b);          // выдаст ошибку  

Переменная "y" объявлена в локальном контексте путём указания её  в круглых скобочках как имя первого аргумента функции. Эта запись почти равносильна следующей


function f()                    // вот здесь ВСЁ ПОНЯТНО
    {
       var y = arguments[0]; // вот оно

       y = {a:100, b:100};        
    };

f();             
WScript.Echo(y.a + "----" + y.b);          // выдаст ошибку  

10 (изменено: max7, 2013-06-02 02:37:54)

Re: JS:передача по ссылке и по значению.

Rumata пишет:

... Есть переменная - объект y, есть функция f, которой эту переменную передали. Так как переменная - объект, то передается она по ссылке (!!!). И, предполагается, что ее (переменную) можно изменить...

Rumata, прочти то что ты написал как бы "отстранёно", и "увидь", пожалуйста, всю смысловую абсурдность этого предложения с точки зрения точных значений понятий и русского языка.

11

Re: JS:передача по ссылке и по значению.

max7
Увидеть "то что я написал" отстранено не могу. Там три предложения. Мне очень трудно сделать выбор. Покажите, пожалуйста, абсурдность каждого из них.

( 2 * b ) || ! ( 2 * b )

12 (изменено: max7, 2013-06-02 07:42:02)

Re: JS:передача по ссылке и по значению.

Rumata пишет:

Есть переменная - объект y, есть функция f, которой эту переменную передали. Так как переменная - объект, то передается она по ссылке (!!!). И, предполагается, что ее (переменную) можно изменить.

Rumata пишет:

Увидеть "то что я написал" отстранено не могу. Там три предложения. Мне очень трудно сделать выбор. Покажите, пожалуйста, абсурдность каждого из них.

Мы же тут на русском языке пишем, я надеюсь. Обычно орфографические и даже пунктуационные ошибки не особо мешают. Но, ошибки в построении предложений, особо интересная тема.

"Есть переменная - объект y", - переменная содержит, ссылается (может "обозначает") объект, она не может "быть" объектом.

"которой эту переменную передали", - переменную в js "передать" невозможно, можно передать значение, объект.

"Так как переменная - объект, то передается она по ссылке", - переменная не может быть объектом, она "переменная" и ссылается на объект. Передать переменную в js "по ссылке" невозможно.

"И, предполагается, что ее (переменную) можно изменить", - переменная не передаётся в js "по ссылке", и её невозможно "изменить", передаётся объект (на который ссылалась переменная), его можно изменить.

13

Re: JS:передача по ссылке и по значению.

Пришел грамма-наци и все опошлил.

"И, предполагается, что ее (переменную) можно изменить", - переменная не передаётся в js "по ссылке", и её невозможно "изменить", передаётся объект (на который ссылалась переменная), его можно изменить.

Истолкуйте следующий код в свете Ваших слов.


function f(o)
{
    o.a = 1;
};

var o = {};
f(o);
WScript.Echo(o.a);
( 2 * b ) || ! ( 2 * b )

14

Re: JS:передача по ссылке и по значению.

Rumata корректнее наверное была бы в цвете дискуссии такая запись ?
(хотя результат тот же)

function f(x)
{
    x.a = 1;
};

var o = {};
f(o);
WScript.Echo(o.a);
Я конечно далек от мысли... (с)

15

Re: JS:передача по ссылке и по значению.

Здесь изменяется свойство объекта, а в переменной "о" как была ссылка на этот объект, так и осталась, т.е. её значение не изменилось.

16 (изменено: max7, 2013-06-02 14:51:39)

Re: JS:передача по ссылке и по значению.

Rumata пишет:

Пришел грамма-наци и все опошлил.

"Спасибо", меня впервые обозвали "грамма-наци".

Rumata пишет:

Истолкуйте следующий код ...

У меня "разрыв шаблона". Я то думал, что исходный код интерпретируется/компилируется/исполняется в соответствии со спецификацией. А он оказывается "истолковывается". Спасибо, я это запомню и возьму на вооружение ;-)


function f(o)
{
    o.a = 1;
};

var o = {};
f(o);
WScript.Echo(o.a);

Распарсен/проанализирован/скомпилирован я буду называть "обработан".

Если вкратце, то:

0. Обработан текст скрипта.
1. В текущем контексте объявлена именованная функция "f" ("скрытая" переменная),
2.0. Её код также обработан.
2.1. Объявлена в контексте функции переменная "o".
2.2. Подготовлен код для исполнения.
3. В текущем контексте объявлена переменная "o".
4. Подготовлен код для исполнения.
5. Исполнение...
6. Создан объект.
7. Переменной (текущего контекста) "o" присвоена ссылка на этот объект.
8. Из переменной (текущего контекста) "f" получена ссылка на функцию.
9. Из переменной (текущего контекста) "o" получена ссылка на объект.
10. Во внутренней структуре функции, хранящей массив переданных аргументов, по индексу [0] записана ссылка на объект.
11. Вызов функции, создан новый контекст исполнения.
12.0. В контекст функции.
12.1. Переменной (в контексте функции) "o" присвоено значение по индексу [0] из массива аргументов.
12.2. Из переменной (в контексте функции) "o" получена ссылка на объект.
12.3. Создание/запрос у объекта свойства с именем "a".
12.4. Запись значения свойства...
12.5. Выход из функции, "разрушение" контекста.
13. Возврат в вышестоящий контекст.
14. ... получена ссылка на функцию из WScript.Echo ...
(в данном случае условно, так как здесь вызов через ActiveX/IDispatch)
15. Из переменной (текущего контекста) "o" получена ссылка на объект.
16. По ссылке на объект ... получено значение свойства с именем "a".
17. Во внутренней структуре функции, хранящей массив переданных аргументов, по индексу [0] записано число 1.
18. Вызов функции...
19. и т. д.

17 (изменено: im2002, 2013-06-02 18:37:10)

Re: JS:передача по ссылке и по значению.

Все попытки "что-либо почитать" и прочие мои "мозговые штурмы" к полному пониманию картины увы так и не привели... видно не для "моих мозгов" . Однако "природа не терпит пустоты", поэтому "объяснение для себя", которое, надеюсь поможет решать подобные примеры нашёл.
Итак, с чего всё начиналось:

случай 1:

function f(y)
    {
/* что происходит, после вызова ф-ии, с параметром как указано ниже? в функцию, посредством переменной у
была передана ссылка на объект. хорошо, передалась ссылка. дальше что? а дальше по контексту, с переданным
при вызове объектом должно быть что-то типа: {a:1} = {a:100, b:100};  как это понять?!
что само по себе абсурдно, поэтому логично, что переменная y и после вызова ф-ции, будет указывать на 
объект, имеющий 1 св-во а = 1, т.е. объект переданный в ф-ю никак не изменился
*/
        y = {a:100, b:100};        
    };
var y = {a:1};    
f(y);                            // вызов функции 
WScript.Echo("Параметр у.а = " + y.a + "\nПараметр у.b = " + y.b);    

случай 2:

function f(t)
    {
/* что происходит, после вызова ф-ии, с параметром как указано ниже? в функцию, посредством переменной у
была передана ссылка на объект. хорошо, передалась ссылка. дальше что? а дальше по контексту, с переданным
при вызове объектом ничего происходить не должно, он вообще "в теле ф-ии" никак более не используется!
но зато при выполнении функции создаётся объект с двумя свойствами, 
а ссылка на него записывается в перем. "у".  Т.к. ранее в данную переменную была записана ссылка на
"другой" объект, то она (ссылка) перезаписывается "указателем на новый объект". теперь у объекта, на который
ссылается у 2 значения.  
*/
        y = {a:100, b:100};        
    };
var y = {a:1};    
f(y);                            // вызов функции с параметром y
WScript.Echo("Параметр у.а = " + y.a + "\nПараметр у.b = " + y.b);    

случай 3:

function f(t)
    {
/*  
между данным примером и примером "случай 2" нет никакой разницы
*/
        y = {a:100, b:100};        
    };
var y = {a:1};    
f();                            // вызов функции без параметра
WScript.Echo("Параметр у.а = " + y.a + "\nПараметр у.b = " + y.b);    

случай 4:

function f(y)
    {
/* между данным примером и примером из "случай 1" разница в том, что
вместо: {a:1} = {a:100, b:100} здесь имеет место быть: "ничего" = {a:100, b:100}
что также абсурдно
*/
        y = {a:100, b:100};        
    };
var y = {a:1};    
f();                            // вызов функции 
WScript.Echo("Параметр у.а = " + y.a + "\nПараметр у.b = " + y.b);   

Вроде как-то так...

Вот тут от Rumata, что-то подобное, что навело на те выводы, которые для себя придумал .

// объявлена функция с одним аргументом
function f(y)
{
    // мы в праве сделать что-то с ЭТИМ АРГУМЕНТОМ (не переменной!)
    y = {a:100, b:100};
};

// явно вызвали функцию, но ничего не передали
// Тоже имеем право - ничего не передавать в функцию
f();

// нет переменной, получаем ошибку
WScript.Echo(y.a + "----" + y.b);

18

Re: JS:передача по ссылке и по значению.

im2002 пишет:

а дальше по контексту, с переданным при вызове объектом должно быть что-то типа: {a:1} = {a:100, b:100};  как это понять?!

Никак этого не должно быть. Переменная — это ящик. Глобальная переменная — один ящик, параметр функции — другой ящик, даже если у них одно и то же имя. При передаче в функцию вы берёте вещь из одного ящика, делаете её копию и кладёте в другой, так она попадает в функцию. Если там вы её выкинете и положите в ящик-параметр что-то другое, то как это скажется на глобальном ящике? Никак. Там что лежало, то и будет лежать.

В случае "передачи объекта" делается копия ссылки, сам объект не копируется. По ссылке объект можно изменить, и эти изменения будут видны и снаружи, т.к. объект один и тот же.

19 (изменено: max7, 2013-06-03 04:26:29)

Re: JS:передача по ссылке и по значению.

im2002, что непонятно из моего комментария #9? Если "всё", и учебник скажем на javascript.ru ничем не помог, может это не твоя тема?

Давай по чуть-чуть.

im2002 пишет:

... что-то подобное, что навело на те выводы, которые для себя придумал .

// объявлена функция с одним аргументом
function f(y)
{
    // мы в праве сделать что-то с ЭТИМ АРГУМЕНТОМ (не переменной!)
    y = {a:100, b:100};
};

// явно вызвали функцию, но ничего не передали
// Тоже имеем право - ничего не передавать в функцию
f();

// нет переменной, получаем ошибку
WScript.Echo(y.a + "----" + y.b);

Ты пишешь: "мы в праве сделать что-то с ЭТИМ АРГУМЕНТОМ (не переменной!)".
Повторю ещё раз:
ЕСЛИ В СКОБОЧКАХ ПРИ ОБЪЯВЛЕНИИ ФУНКЦИИ ЗАПИСАНО КАКОЕ-ТО ИМЯ (ИЛИ НЕСКОЛЬКО ИМЁН), ОНО АВТОМАТИЧЕСКИ ОБЪЯВЛЯЕТСЯ ЛОКАЛЬНОЙ ПЕРЕМЕННОЙ, НЕ МНОЙ, НЕ ТОБОЙ, А JS ПРИ РАЗБОРЕ СКРИПТА, КАК БУДТО В ФУНКЦИИ НАПИСАНО "VAR Y;" И С ТЕМ ЖЕ РЕЗУЛЬТАТОМ. ЗДЕСТЬ "Y" ЭТО ЛОКАЛЬНАЯ ПЕРЕМЕННАЯ КОТОРОЙ БУДЕТ ПРИСВОЕНО ЗНАЧЕНИЕ ПЕРВОГО АРГУМЕНТА ПРИ ВЫЗОВЕ. АРГУМЕНТЫ ФУНКЦИИ ИДУТ ПО ИНДЕКСАМ ПРИ ВЫЗОВЕ: НУЛЕВОЙ, ПЕРВЫЙ, ВТОРОЙ И Т. Д. А ВНУТРИ ФУНКЦИИ, В СООТВЕТСТВИИ С ПОРЯДКОМ ЗАПИСИ, ЛОКАЛЬНЫМ ПЕРЕМЕННЫМ ПРИСВАИВАЮТСЯ ЗНАЧЕНИЯ АРГУМЕНТОВ.


function f(y) // <- Во это объявление локальной ПЕРЕМЕННОЙ с именем "y", 
              // запись её в скобочках означает, 
              // что при вызове функции ей будет присвоено значение первого аргумента. 
              // Эту "y" называют "именованы аргумент", чтобы подчеркнуть, 
              // что это не просто локальная переменная, 
              // а такая локальная переменная, 
              // которой присвоили значение первого аргумента, 
              // который был записан в скобочках при вызове.
{
   // ... 
}

Аргументы, это ПРИ ВЫЗОВЕ,  там где "явно вызвали функцию", значение того что записали в скобочках, то и аргумент:
f(); // нисколько аргументов
f(a); // один аргумент
f(a,b); // два аргумента
f(a,b,c); // три аргумента

Запись

y = {a:100, b:100}; 

означает, что переменной "y" присвоили ссылку на новый объект, ни с каким "аргументом" здесь вообще ничего не происходит, нет здесь никаких "аргументов".


Что непонятно конкретно в этом сообщении?

20 (изменено: badik, 2013-06-03 09:28:49)

Re: JS:передача по ссылке и по значению.

Немного подправил


function f(y_link)
    {
//Не правильно теряеем ссылку на объект
//y_link = {a:100, b:100};

 // мы в праве сделать что-то со свойствами   Объекта y
        y_link.a=100
        y_link.b=100
    };
 
var y = {a:1};             // определение объекта y с параметром а со значением 1
f(y);                            // вызов функции 
WScript.Echo("Параметр у.а = " + y.a + "\nПараметр у.b = " + y.b);   

21

Re: JS:передача по ссылке и по значению.

max7 пишет:

Повторю ещё раз:

Для цитирования (и самого себя в том числе) применяется тэг «qoute». Для выделения, подчёркивания какой-либо мысли — «b», или «i», или «u». Пожалуйста, не надо писать одними заглавными буквами.

22

Re: JS:передача по ссылке и по значению.

max7 пишет:

im2002, что непонятно из моего комментария #9? Если "всё", и учебник скажем на javascript.ru ничем не помог, может это не твоя тема?

Тот кусок, который вы разбираете далее "составил" не я, а уважаемый Rumata, просто такое толкование было наиболее близко "моему пониманию", вот я и сослался... .
Что касается ваших замечаний. По поводу действий интерпретатора, которые вы изложили в п. 0-19, было много непоняток и вопросов,  просто обсуждать не стал, тема простая, и так раздута, чтоб "не засорять" так сказать. Что касается замечаний в вашем последнем комментарии, которые "с заглавной буквы" вот смотрите, что получается:

Согласно изложенному вами:

function f(y)
    {
/* 
что происходит, после вызова ф-ии, с параметром как указано ниже? в локальную переменную у записывается
аргумент с индексом [0]. что это за аргумент? это ссылка на массив {a:1}, т.е. в нашей ф-ции как бы появилась 
запись y = {a:1}; затем по контексту имеется запись:  y = {a:100, b:100};  что произойдёт? переменная у 
потеряет ссылку на объект {a:1}, а вместо этого "приобретёт" ссылку на объект {a:100, b:100}. 
казалось бы WScript.Echo должна показать результат 100 и 100... ан нет! показывает 1 и underfined! 
почему?! да переменная y внутри ф-ции локальная (с чего и начинался разбор), за пределами ф-ции "не видна", 
там другая, своя у есть! почему локальная где var? не нужно var, сам JS "так устроен"
*/
        y = {a:100, b:100};        
    };
var y = {a:1};    
f(y);                            // вызов функции 
WScript.Echo("Параметр у.а = " + y.a + "\nПараметр у.b = " + y.b);   

Вот как-то так получается, согласен, что такое не очевидное  допущение (что у локальная)  выглядит более
"привлекательно", чем моё объяснение {a:1} = {a:100, b:100}!!! .
Всем спасибо. Тема закрыта, вопросов больше нет!

23 (изменено: max7, 2013-06-03 11:40:55)

Re: JS:передача по ссылке и по значению.

im2002 пишет:

... что такое не очевидное  допущение (что у локальная) ...

И что в нём не очевидного, и где здесь допущение? Это преподается на всех курсах, и об этом написано во все учебниках "в самом начале". Это общее место, общий принцип.

function f(y)
{
   // ...
};

При такой (или подобной) "записи", "y" будет локальной во всех языках программирования.

24

Re: JS:передача по ссылке и по значению.

max7 пишет:

Повторю ещё раз:
ЕСЛИ В СКОБОЧКАХ ПРИ ОБЪЯВЛЕНИИ ФУНКЦИИ ЗАПИСАНО КАКОЕ-ТО ИМЯ (ИЛИ НЕСКОЛЬКО ИМЁН), ОНО АВТОМАТИЧЕСКИ ОБЪЯВЛЯЕТСЯ ЛОКАЛЬНОЙ ПЕРЕМЕННОЙ, НЕ МНОЙ, НЕ ТОБОЙ, А JS ПРИ РАЗБОРЕ СКРИПТА, КАК БУДТО В ФУНКЦИИ НАПИСАНО "VAR Y;" И С ТЕМ ЖЕ РЕЗУЛЬТАТОМ. ЗДЕСТЬ "Y" ЭТО ЛОКАЛЬНАЯ ПЕРЕМЕННАЯ КОТОРОЙ БУДЕТ ПРИСВОЕНО ЗНАЧЕНИЕ ПЕРВОГО АРГУМЕНТА ПРИ ВЫЗОВЕ. АРГУМЕНТЫ ФУНКЦИИ ИДУТ ПО ИНДЕКСАМ ПРИ ВЫЗОВЕ: НУЛЕВОЙ, ПЕРВЫЙ, ВТОРОЙ И Т. Д. А ВНУТРИ ФУНКЦИИ, В СООТВЕТСТВИИ С ПОРЯДКОМ ЗАПИСИ, ЛОКАЛЬНЫМ ПЕРЕМЕННЫМ ПРИСВАИВАЮТСЯ ЗНАЧЕНИЯ АРГУМЕНТОВ.
Что непонятно конкретно в этом сообщении?

хотел оставить тему "в покое", но не удержался! .

function f(y)
    {
    y.a = 100, y.b = 100;        
/*
определить в объекте у свойства а и b с указанными значениями, если конечно такой объект
существует
*/
         };
 
var y = {a:1};                // запись ссылки на объект в перем. у
 

f(y);                            // вызов функции, передача в ф-ю ссылки на объект
 
WScript.Echo("Значения ПОСЛЕ применения функции:\n" + "Параметр у.а = " + y.a + "\n" + "Параметр у.b = " + y.b);
                    /* 
                    что происходит в процессе выполнения ф-ии согласно max 7:
                    1. внутри функции создана переменная у со значением arguments[0] (var y = arguments[0]);
                    2. переменная y получает ссылку, на объект, переданный ф-ции при вызове: var y = {a:1};
                    3. т.к. объект существует, св-во "а" принимает значение "100", добавляется св-во "b" , 
                                            также со значением "100".
                    4. поскольку у "локальная переменная", её значение - ссылка на объект {a:100, b:100} 
                                            будет актуальна       только в пределах данной функции.
                    5. инструкция WScript.Echo вернёт результат "1" и "underfined", т.е. те значения для 
                                            объекта а, которые определены вне пределов функции f
                    */

однако "непослушная" WScript.Echo возвращает 100 и 100. .
Всё, теперь точно закрыта тема.

25 (изменено: max7, 2013-06-03 12:50:08)

Re: JS:передача по ссылке и по значению.

im2002 пишет:

...


...
что происходит в процессе выполнения ф-ии согласно max 7:
...
4. поскольку у "локальная переменная", её значение - ссылка на объект {a:100, b:100} 
будет актуальна только в пределах данной функции.
...

...

Чушь полную написал, вот такой ахинеи с учётом тобою же  написанного текста я не ожидал.
Ссылка на объект (сам объект) создана, сохранена и передана в функцию из внешнего по отношению к ней контекста и существует за пределами функции. В функции нет создания нового объекта, только изменение существующего. Так что это не "согласно max7", а "согласно" твоего бреда.

26

Re: JS:передача по ссылке и по значению.

2max7: коллега, спокойнее, пожалуйста.

27

Re: JS:передача по ссылке и по значению.

max7 пишет:

В функции нет создания нового объекта

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

28

Re: JS:передача по ссылке и по значению.

im2002 пишет:

Оба ваших примера никаких сомнений и возражений не вызывают, вопрос не в этом

im2002 пишет:

небольшая путаница произошла, вследствие того, что и локальная переменная внутри ф-ии и глобальная переменная вне ф-ции имеют одинаковые имена

Вопрос: Как это может привести к "путанице", если всё выше написанное тебе понятно?

29

Re: JS:передача по ссылке и по значению.

max7 пишет:

Вопрос: Как это может привести к "путанице", если всё выше написанное тебе понятно?

так бывает, этот ответ я писал на:
http://forum.script-coding.com/viewtopi … 617#p72617

пока я это писал, появилось:
http://forum.script-coding.com/viewtopi … 622#p72622

так вроде разобрались, уже думал....