2016-04-20 8 views
4

У меня есть переменная области видимости, которая имеет значение false по умолчанию.как передать переменную ссылкой ref в javascript

Я хочу, чтобы передать эту переменную функции, чтобы изменить ее значение на true.

, но это невозможно, так как переход параметров в JavaScript по значению.

это простой код, что я пытаюсь сделать:

myapp.controller('PersonCtrl', function ($scope) { 
    $scope.step = false; 
    change($scope.step); 
    console.log($scope.step); 
}); 

change = function(step){ 
    step = true; 
} 

jsfiddle:

http://jsfiddle.net/SNF9x/177/

как я могу решить эту проблему?

+0

Почему вы не объявляете глобальную переменную? –

+0

передают $ scope вместо $ scope.step, если это возможно, иначе просто установите $ scope.step в возвращаемое значение функции. –

+0

@HarishKumar В любом нетривиальном приложении глобальные переменные быстро становятся громоздкими и подвержены конфликтам –

ответ

5

Вы можете передать объект, удерживающими primtive к вашей функции изменения:

myapp.controller('PersonCtrl', function ($scope) { 
    $scope.step = false; 
    change($scope); 
    console.log($scope.step); 
}); 

change = function(obj){ 
    obj.step = true; 
} 

Вы могли бы событие передать имя переменной, которую вы хотите изменить:

myapp.controller('PersonCtrl', function ($scope) { 
    $scope.step = false; 
    change($scope, 'step'); 
    console.log($scope.step); 
}); 

change = function(obj, prop){ 
    obj[prop] = true; 
} 
3

Вы не можете пройти переменные по ссылке в JS, но вы можете передавать объекты по ссылке, а затем изменять свойства, например ...

myapp.controller('PersonCtrl', function ($scope) { 
    $scope.step = false; 
    change($scope); 
    console.log($scope.step); 
}); 

change = function($scp){ 
    $scp.step = true; 
} 

jsfiddle:

http://jsfiddle.net/SNF9x/178/

+0

Я бы рекомендовал не начинать имя параметра с '$'. –

+1

Я бы этого не сделал, так как исходная переменная использует префикс '' ', но это не правильно, а не неправильно и просто предпочтение. – Archer

+0

Я думаю, что это вызовет путаницу; обычно (или, по крайней мере, в моем опыте) '$ var' означает, что он глобальный. Если это не так, в более крупном методе это может запутать. –

1

В вашем OP попытке изменить значение примитивного типа:

var o = { 
    b: true 
}; 
changeValue(o.b);//pass a primitive type to the function 
console.log(o.b);//print out true because is primitive type and all primitive types pass by value 

function changeValue(b) { 
    b = false; 
} 

Одно решение будет передать объект $scope функции:

var myapp = angular.module('myapp', []); 

myapp.controller('PersonCtrl', function($scope) { 
    $scope.step = false; 
    change($scope); 
    console.log($scope.step);//prints out true 
}); 

change = function(obj) { 
    obj.step = true; 
} 

fiddle

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