我有一个带有两个参数的函数,例如function (a,b)
。我想在函数中,取b的值,并用c替换它。我在考虑像$(b).replaceWith(c)
这样的东西,但它没有成功。我知道我可以使用新值在函数内创建一个新变量,但是可以更改b本身的值吗?这样的事情是可能的。或者参数设置在石头上?
让我试着解释一下我想做什么。有三个函数,一个是总体函数,然后是两个函数,由toggle事件触发。我希望第二个函数做一些事情来获取一个值并将其传递给第三个函数。所以这里是代码
function(a,b){
$('selector').toggle(
//I want this to gather a value and store it in a variable
function(){},
//and I want this to accept the variable and value from the previous function
function(){}
)}
我能想到的唯一方法是为总体函数添加一个参数c,然后用第一个函数修改它,并将新值传递给第二个函数。
答案 0 :(得分:31)
您无法在JavaScript中通过引用显式传递;但是,如果b
是一个对象,并且在您的函数中修改了b
的属性,则更改将反映在调用范围内。
如果您需要使用基元执行此操作,则需要返回新值:
function increaseB(b) {
// Or in one line, return b + 1;
var c = b + 1;
return c;
}
var b = 3;
b = increaseB(b); // 4
答案 1 :(得分:11)
您无法在JavaScript中更改整数或字符串的值但您可以更改对象属性的值,例如
function change(x){
x.x=2;
}
使用
进行通话时var y = {x:1};
change(y);
将使y.x = 2;
答案 2 :(得分:1)
传递对象时,您将传递对该对象的引用。因此,在修改传递给函数的对象时,您正在修改该原始对象。因此,您可以创建一个包含单个变量的非常简单的对象,该变量允许您将值从一个函数传递到下一个函数。
关于将这些函数调用放入另一个函数的参数列表的方式,有一点需要注意。我不确定执行的顺序是什么,用于评估参数列表。也许知道更多关于Javascript的人可以回答这个问题。但是,并非所有语言都会从左到右评估参数列表,这意味着您可能会发现第二个函数在第一个函数之前执行。但是,我不确定Javascript的执行顺序,因此可能不是一个问题。
function(a,b){
var object_c = {
c: 10
};
$('selector').toggle(
//send object_c in to gather a value and store it in the "c" field
function(object_c){},
//send the same object_c object into the second function
function(object_c){}
)}
答案 3 :(得分:1)
如果变量在全局范围内,您可以按如下方式设置:
function modify(name,newVal){
window[name] = newVal;
}
然后,试试这个:
var foo = 10;
modify('foo','bar');
console.log(foo); // bar
答案 4 :(得分:0)
b = c; // very little is set in stone in javascript
答案 5 :(得分:0)
您可以替换值:
function myFunc() {
var a = 1, b = 2, c = 3;
function changeB(a, b) {
b = c;
}
changeB(a, b);
}
答案 6 :(得分:0)
你可以,但这是不好的做法,
<块引用>不要重新分配函数参数
https://spin.atomicobject.com/2011/04/10/javascript-don-t-reassign-your-function-arguments/
改用解构。
答案 7 :(得分:-1)
你的意思是:
// fun is Your actual function (a,b)
var actualFunction = fun;
fun = function (a,b){
var c = 10;
actualFunction(a,c);
}
让我解释一下发生了什么:你正在创建一个变量(actualFunction)并让它保存指向你的函数(a,b)的指针(在这里命名为“fun”)。然后你正在设置“fun”的新定义,所以它用你喜欢的参数调用旧的。
我不确定它是否会在没有例外情况下运行,但请尝试并告诉我们。