在JavaScript中发送params作为参考

时间:2018-02-01 22:24:52

标签: javascript reference pass-by-reference

javascript中有没有办法通过引用发送var并在函数内初始化它。

例如:

function init(param){param = function(){}}
var undefinedVar;
init(undefinedVar);
在此调用之后,

undefined var将保持undefined

我知道只有对象作为参考发送到ex:

function init(param){param.attr='';}
var objectVar = {}
init(objectVar);

此后,objectVar的值将为{attr:""}

任何人都知道强制这种行为用于非对象变量的方法吗?

由于

2 个答案:

答案 0 :(得分:0)

只有原始类型(字符串,布尔值,数字,空值,未定义)在JavaScript中按值传递。 但是数组和对象是通过引用传递的。

使用数组:

function init(param){param.push('hello')}
var undefinedVar =[];
init(undefinedVar);
console.log(undefinedVar); // print ['hello']

使用对象:

function init(param){param['test'] = 'init'}
var undefinedVar = {};
init(undefinedVar);
console.log(undefinedVar); // print {test : 'init'}

他们是一些谈论它的帖子:

Javascript by reference vs. by value

希望它有所帮助。

答案 1 :(得分:0)

模拟我通过引用的方式发送的最“类似”的方法是访问父作用域的上下文,将var名称的引用作为字符串发送:

var undefinedVar, undefinedVar2, undefinedVar3;

function init() {
  for(var i=0; i<arguments.length; i++){
    this[arguments[i]] = new Function();
  }
}
init('undefinedVar', 'undefinedVar2', 'undefinedVar3');

这对于函数内的初始化或验证参数非常有用。

例如,而不是像这样重复代码

(function myContext(arg1, arg2, arg3){
  if(!arg1 || (typeof(arg1)!='function')){
    arg1 = new Function();
  }
  if(!arg2 || (typeof(arg1)!='function')){
    arg2 = new Function();
  }
  if(!arg3 || (typeof(arg1)!='function')){
    arg3 = new Function();
  }
  console.log(arguments);  
})()

我们可以做以下

function init(context) {
  for(var i=1; i<arguments.length; i++){
    if(!context[arguments[i]] || (typeof(arg1)!='function'))
      (context[arguments[i]] = new Function());
  }
}

(function myContext(arg1, arg2, arg3){
  init(arguments, 'arg1', 'arg2', 'arg3');
  console.log(arguments);  
})()

打印

  

arg1:ƒ匿名()arg2:ƒ匿名()arg3:ƒ匿名()

这有助于避免在这种情况下出现严重的代码。