函数内的javascript变量指针

函数内的javascript变量指针,javascript,function,variables,variable-assignment,Javascript,Function,Variables,Variable Assignment,这里有一个奇怪的例子: var a = true; function f(v){ v = !v; } //can this function actually change a? f(a); //a is still true.. 显然,如果函数是内部v变量,那么它只会更改值 我在一个应用程序中遇到了这种情况,该应用程序应该在运行时动态更改DOM元素属性的值。所以理想情况下应该有一个函数,将属性作为参数并重新赋值,对吗 为了清楚起见,我实际上在尝试在运行时为

这里有一个奇怪的例子:

var a = true;
function f(v){ v = !v; }        //can this function actually change a?
f(a);   //a is still true..         
显然,如果函数是内部v变量,那么它只会更改值

我在一个应用程序中遇到了这种情况,该应用程序应该在运行时动态更改DOM元素属性的值。所以理想情况下应该有一个函数,将属性作为参数并重新赋值,对吗

为了清楚起见,我实际上在尝试在运行时为DOM元素的属性分配新值:我有一个反射器应用程序,可以迭代对象的成员,我希望它能够更改遇到的属性的值,因此,f函数将属于BooleanSwitch构造函数,该构造函数为反射对象中的每个布尔类型属性构建BooleanSwitch对象。布尔开关可以是屏幕上的一个简单按钮。我希望只需单击按钮即可更改手头对象的实际属性值。。 有人能想出一个办法吗


任何想法都是值得的

原语值按值传递。您将布尔值传递给该函数,因此它无法更改在外部声明的变量a的值。

基本值是按值传递的。您将布尔值传递给该函数,因此它无法更改在外部声明的变量a的值。

对象数组,函数作为引用传递。复制所有其他类型int、string等

在您的示例中,“v”是“a”的副本,因此“a”不变

您需要从switch函数返回一个值,并将其分配给a。例如:

function switch(v)
{
//do something
return v;
}

a = switch(a);

对象数组、函数作为引用传递。复制所有其他类型int、string等

在您的示例中,“v”是“a”的副本,因此“a”不变

您需要从switch函数返回一个值,并将其分配给a。例如:

function switch(v)
{
//do something
return v;
}

a = switch(a);

函数必须返回一个值

function switchValue(v){ 
  return !v;
}        

var a = true;
switchValue(a);

这是因为JavaScript引用特性。如果传入变量但不返回它,则该变量只会在本地更改。如果你想改变它,你必须特别归还它

函数必须返回一个值

function switchValue(v){ 
  return !v;
}        

var a = true;
switchValue(a);

这是因为JavaScript引用特性。如果传入变量但不返回它,则该变量只会在本地更改。如果你想改变它,你必须特别归还它

所以我想出了一个很好的方法:

布尔值,因为其他基本值是通过值传递的,但对象是通过引用传递的。。 如果传递给函数f的布尔值属于对象,则可以通过引用传递该值。 因此:

这看起来有点奇怪,仍然是硬编码的,但可以使其在遍历对象时与属性一起动态工作

在我的实际应用程序中,它看起来像这样:

function BooleanSwitch(obj, property){
    var btn = document.createElement("button");
    btn.onclick = function(){
        obj[property] = !obj[property];
    }
    return btn;
}

function reflect(obj){
    for(member in obj){
        switch(typeof(obj[member])){
            case "boolean":
                var booleanSwitch = BooleanSwitch(obj, member);
                document.body.appendChild(booleanSwitch);  //or whatever..
                break;
            case "string": //..other stuff..
        }
    }
}

reflect(document);    
这将为文档对象的每个可枚举布尔属性创建一个布尔开关。
当您单击此按钮时,它会更改文档的实际属性。

因此,我们想出了一个很好的方法:

布尔值,因为其他基本值是通过值传递的,但对象是通过引用传递的。。 如果传递给函数f的布尔值属于对象,则可以通过引用传递该值。 因此:

这看起来有点奇怪,仍然是硬编码的,但可以使其在遍历对象时与属性一起动态工作

在我的实际应用程序中,它看起来像这样:

function BooleanSwitch(obj, property){
    var btn = document.createElement("button");
    btn.onclick = function(){
        obj[property] = !obj[property];
    }
    return btn;
}

function reflect(obj){
    for(member in obj){
        switch(typeof(obj[member])){
            case "boolean":
                var booleanSwitch = BooleanSwitch(obj, member);
                document.body.appendChild(booleanSwitch);  //or whatever..
                break;
            case "string": //..other stuff..
        }
    }
}

reflect(document);    
这将为文档对象的每个可枚举布尔属性创建一个布尔开关。
当您单击此按钮时,它会更改文档的实际属性。

您确定遇到的函数没有返回语句或接受对象参数吗?…您确定函数名为switch吗?这不是有效的函数名。听起来像。你到底想做什么?请按照前面指出的更新你的代码。根据代码,你的问题不是问题,只要你不想给函数体中的变量a赋值,你只是在赋值作为参数传递的变量v。@..607我遇到了问题,不是代码。但是你在switch关键字的右边,我已经修复了。你确定你遇到的函数没有返回语句或接受对象参数吗?…你确定函数名为switch吗?这不是有效的函数名。听起来像。你到底想做什么?请按照前面指出的更新你的代码。根据代码,你的问题不是问题,只要你不想给函数体中的变量a赋值,你只是在赋值作为参数传递的变量v。@..607我遇到了问题,不是代码。但是你在switch关键字的右边,我已经修好了。函数开关神奇地知道变量a在哪里?并且此代码不会运行..例如,将函数名更改为switch以外的其他名称
le switchValuevAnd功能开关神奇地知道变量a在哪里?这段代码将不会运行..将函数名更改为switch以外的其他名称,例如switchValuevyes,这显然是可行的,但我真正的问题是我不知道“a”是什么。这只有在运行时才知道。因此,我不能将作业硬编码为“a”,为了清楚起见,我对问题进行了编辑。thnx.是的,这显然是可行的,但我真正的问题是我不知道“a”是什么。这只有在运行时才知道。因此,我无法将作业硬编码为“a”,为了清楚起见,我对问题进行了编辑。