如何在JavaScript中通过引用传递变量?
我有三个变量,我想对它们执行一些操作,所以我想把它们放在一个for循环中,并对每个变量执行操作。
伪代码:
myArray = new Array(var1, var2, var3);
for (var x = 0; x < myArray.length; x++){
// Do stuff to the array
makePretty(myArray[x]);
}
// Now do stuff to the updated variables
最好的方法是什么?
另一种通过引用传递任何(局部的,基本的)变量的方法是通过eval“动态”地用闭包包装变量。这也适用于“use strict”。(注意:注意eval对JavaScript优化器不友好,并且变量名周围缺少引号可能会导致不可预测的结果)
"use strict"
// Return text that will reference variable by name (by capturing that variable to closure)
function byRef(varName){
return "({get value(){return "+varName+";}, set value(v){"+varName+"=v;}})";
}
// Demo
// Assign argument by reference
function modifyArgument(argRef, multiplier){
argRef.value = argRef.value * multiplier;
}
(function(){
var x = 10;
alert("x before: " + x);
modifyArgument(eval(byRef("x")), 42);
alert("x after: " + x);
})()
现场示例:https://jsfiddle.net/t3k4403w/
我喜欢在JavaScript中解决引用的不足,就像这个例子所显示的那样。
这样做的本质是,您不必尝试创建一个通过引用。相反,您可以使用返回功能,并使其能够返回多个值。因此,不需要在数组或对象中插入值。
var x = "First";
var y = "Second";
var z = "Third";
log('Before call:',x,y,z);
with (myFunc(x, y, z)) {x = a; y = b; z = c;} // <-- Way to call it
log('After call :',x,y,z);
function myFunc(a, b, c) {
a = "Changed first parameter";
b = "Changed second parameter";
c = "Changed third parameter";
return {a:a, b:b, c:c}; // <-- Return multiple values
}
function log(txt,p1,p2,p3) {
document.getElementById('msg').innerHTML += txt + '<br>' + p1 + '<br>' + p2 + '<br>' + p3 + '<br><br>'
}
<div id='msg'></div>
其实有一个很好的解决方案:
function updateArray(context, targetName, callback) {
context[targetName] = context[targetName].map(callback);
}
var myArray = ['a', 'b', 'c'];
updateArray(this, 'myArray', item => {return '_' + item});
console.log(myArray); //(3) ["_a", "_b", "_c"]
其实很简单。问题在于,一旦传递了经典参数,您就会被限定在另一个只读区域。
解决方案是使用JavaScript的面向对象设计来传递参数。这与将参数放在全局/作用域变量中是一样的,但更好…
function action(){
/* Process this.arg, modification allowed */
}
action.arg = [["empty-array"], "some string", 0x100, "last argument"];
action();
你也可以承诺一些东西来享受著名的连锁店:
这就是全部,像承诺一样的结构
function action(){
/* Process this.arg, modification allowed */
this.arg = ["a", "b"];
}
action.setArg = function(){this.arg = arguments; return this;}
action.setArg(["empty-array"], "some string", 0x100, "last argument")()
或者更好的是……
action.setArg(["empty-array"],"some string",0x100,"last argument").call()
另一种通过引用传递任何(局部的,基本的)变量的方法是通过eval“动态”地用闭包包装变量。这也适用于“use strict”。(注意:注意eval对JavaScript优化器不友好,并且变量名周围缺少引号可能会导致不可预测的结果)
"use strict"
// Return text that will reference variable by name (by capturing that variable to closure)
function byRef(varName){
return "({get value(){return "+varName+";}, set value(v){"+varName+"=v;}})";
}
// Demo
// Assign argument by reference
function modifyArgument(argRef, multiplier){
argRef.value = argRef.value * multiplier;
}
(function(){
var x = 10;
alert("x before: " + x);
modifyArgument(eval(byRef("x")), 42);
alert("x after: " + x);
})()
现场示例:https://jsfiddle.net/t3k4403w/
像字符串和数字这样的基本类型变量总是按值传递。
数组和对象通过引用或基于以下条件的值传递:
如果你正在设置一个对象或数组的值,它是通过值传递。
Object1 = {prop: "car"};
Array1 = [1,2,3];
如果你正在改变一个对象或数组的属性值,那么它是引用传递。
中的object1。道具= "汽车";
Array1 [0] = 9;
Code
函数passVar(obj1, obj2, num) {
其中obj1。道具= "笔记本电脑";//将改变原来的
Obj2 ={道具:"电脑"};//不影响原
Num = Num + 1;//不影响原
}
Var object1 = {
道具:“车”
};
Var object2 = {
道具:“自行车”
};
Var number1 = 10;
passVar(object1, object2, number1);
console.log(中的object1);//输出:对象{道具:"笔记本电脑"}
console.log (object2);//输出:Object {prop: "bike"}
console.log (number1);//输出:10