Вопрос по функции js

Рейтинг: 0Ответов: 1Опубликовано: 10.09.2014
 function plus(a){
       a=a+10;
       alert('Вывод функции: ' + a+'<br />');
    }
    var a=25;

    // Вызовем функцию передав ей в качестве аргумента переменную a
    plus(a);
    alert('Значение переменной после вызова функции: '+a+'<br />');

Почему если из function plus(a) убрать a, то выводится 2 раза по 35, а если оставить, то выводится 35 и 25.

P.S. Мат. часть сейчас учу, поэтому прошу помощи.

Ответы

▲ 1

Вы имеете ввиду из объявления? Потому что область видимости переменной объявленной как аргумент, или с помощью var будет тело функции. Т.е. происходит следующее (я немного изменю код, чтобы порядок был понятнее):

//базовая область видимости (родительская для функции plus)
var a=25; //в базовой области видимости объявляем "a"=25
function plus(a){ //в области видимости функции plus объявляем "a" 
   a=a+10; //тут ссылка на изначальное "a" пропадает (т.к. использован оператор =) 
   // **локальное** "a" = 35
   alert('Вывод функции: ' + a+'<br />');
}

// Вызовем функцию передав ей в качестве аргумента переменную a
plus(a); //передаем ссылку на a
alert('Значение переменной после вызова функции: '+a+'<br />');

Второй случай:

//базовая область видимости (родительская для функции plus)
var a=25; //в базовой области видимости объявляем "a"=25
function plus(){ 
   a=a+10; //тут ссылка на изначальное "a" пропадает (т.к. использован оператор =) 
   // "a" из **базовой области** = 35
   alert('Вывод функции: ' + a+'<br />');
}

// Вызовем функцию передав ей в качестве аргумента переменную a
plus(a); //передаем ссылку на a
alert('Значение переменной после вызова функции: '+a+'<br />');

Чтобы было понятнее про ссылки, тут речь вот о чем:

function test(a,b) {
   a.test=2; //ссылка теряется у того объекта, который непосредственно перед = (.test)
   b={test: 3}; // ... (b)

}

var n={test: [1,2,3]},m={test: [4,5,6]};

test(n,m);

console.log(n.test,m.test); // 2,[4,5,6]