1

所以这里有一个奇怪的:

var a = true;
function f(v){ v = !v; }        //can this function actually change a?
f(a);   //a is still true..         

该函数显然只更改内部v变量的值。

我在一个应用程序上遇到了这个问题,该应用程序应该DOM在运行时动态更改 Elements 的属性值。所以理想情况下应该有一个函数将属性作为参数并重新分配它,对吗?

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

任何想法都可以理解..

4

4 回答 4

3

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

于 2012-10-28T00:13:21.360 回答
1

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

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

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

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

a = switch(a);
于 2012-10-28T00:16:58.797 回答
1

该函数必须返回一个值。

function switchValue(v){ 
  return !v;
}        

var a = true;
switchValue(a);

这是因为 JavaScript 引用特性。如果你传入变量而不返回它,变​​量只会在本地改变。如果您想更改它,您必须专门返回它。

于 2012-10-28T00:22:52.090 回答
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);    

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

于 2012-10-28T13:01:35.643 回答