如何在JavaScript中通过引用传递变量

4

我有一个作用域变量,默认值为false

我想要当我将这个变量传递给一个函数时,能够将它的值修改为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/

我该怎么解决这个问题?


为什么不声明一个全局变量? - Harish Kumar
如果可能的话,请传递 $scope 而不是 $scope.step,否则只需将 $scope.step 设置为函数的返回值。 - hylimR
在任何非平凡的应用程序中,全局变量很快变得笨重且容易发生冲突。 - James Thorpe
3个回答

5
您可以将包含原始数据的对象传递给您的更改函数:
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/


我建议不要以 $ 开头命名参数。 - anon
1
我不会这样做,因为原始变量使用了 $ 前缀,但这并没有对错之分,只是个人喜好。 - Reinstate Monica Cellio
我觉得这会引起混淆;通常(至少在我的经验中)$var 表示它是全局的。如果它不是,在一个较大的方法中可能会变得混乱。 - anon
就像我说的,这只是个人偏好。我个人使用“_”作为全局变量的前缀,如果是jQuery对象,则使用“$”。在这个问题中,我只是保留了它已经有的前缀。但这真的不是讨论的重点,因为这只是一个选择而已。 - Reinstate Monica Cellio
哦,我可能错过了最后三个单词。好的。 - anon

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

程序相关。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接