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:""}
任何人都知道强制这种行为用于非对象变量的方法吗?
由于
答案 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:ƒ匿名()
这有助于避免在这种情况下出现严重的代码。