函数内部的javascript变量指针

时间:2012-10-28 00:09:49

标签: 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元素的属性值。所以理想情况下应该有一个函数将属性作为参数并重新分配,对吧?

为了清楚起见 - 我实际上是在尝试在运行时为DOM元素的属性分配新值:我有一个反射器应用程序,它遍历对象的成员,我希望它能够更改它遇到的属性的值,所以f函数属于BooleanSwitch构造函数,它为反射对象中的每个布尔类型属性构建booleanSwitch对象。 booleanSwitch可以是屏幕上的一个简单按钮。我希望能够通过单击按钮来更改手头对象的实际属性的值。 谁能想到办法做到这一点?

任何想法都很适合..

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

对象(数组,函数)作为参考传递。将复制所有其他类型(int,string等)。

在您的示例中,'v'是'a'的副本,因此'a'不会更改。

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

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

a = switch(a);

答案 2 :(得分:1)

该函数必须返回一个值。

function switchValue(v){ 
  return !v;
}        

var a = true;
switchValue(a);

这是因为JavaScript引用功能。如果传入变量并且不返回它,则变量只会在本地更改。如果您想要更改它,您必须专门返回它。

答案 3 :(得分:0)

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

布尔值,因为其他原始值是按值传递的,但是对象是通过引用传递的。 传递给函数f的布尔值如果属于一个对象,可以通过引用传递。 这样:

var a = true;
function f(v, z){
    v[z] = !v[z];
{
f(window, "a");

看起来有点奇怪,仍然是硬编码的,但在迭代对象时可以使其与属性动态协同工作。

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

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);    

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