如何在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
最好的方法是什么?
如果你想通过引用传递变量,一个更好的方法是通过在对象中传递参数,然后使用window开始更改值:
window["varName"] = value;
例子:
// Variables with first values
var x = 1, b = 0, f = 15;
function asByReference (
argumentHasVars = {}, // Passing variables in object
newValues = []) // Pass new values in array
{
let VarsNames = [];
// Getting variables names one by one
for(let name in argumentHasVars)
VarsNames.push(name);
// Accessing variables by using window one by one
for(let i = 0; i < VarsNames.length; i += 1)
window[VarsNames[i]] = newValues[i]; // Set new value
}
console.log(x, b, f); // Output with first values
asByReference({x, b, f}, [5, 5, 5]); // Passing as by reference
console.log(x, b, f); // Output after changing values
其实很简单。问题在于,一旦传递了经典参数,您就会被限定在另一个只读区域。
解决方案是使用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/
其实有一个很好的解决方案:
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"]
像字符串和数字这样的基本类型变量总是按值传递。
数组和对象通过引用或基于以下条件的值传递:
如果你正在设置一个对象或数组的值,它是通过值传递。
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