【问题标题】:javascript variable pointers inside functions函数内部的javascript变量指针
【发布时间】:2012-10-17 19:16:22
【问题描述】:

所以这里有一个奇怪的:

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 可以是屏幕上的一个简单按钮。我希望能够通过单击按钮来更改手头对象的实际属性的值。 谁能想到办法做到这一点?

任何想法都是appriciated..

【问题讨论】:

  • 你确定你遇到的函数没有return 声明,或者接受对象参数?
  • ...你确定这个函数被命名为switch吗?这不是一个有效的函数名。
  • 听起来像an XY problem。你实际上想做什么?
  • 请如前所述更新您的代码。根据代码,您的问题不是问题,只要您不尝试为函数体内的变量a 分配任何值,您只需分配作为参数传递的变量v
  • @..607 我遇到了问题,不是代码。但是你就在 switch 关键字上,我已经解决了。

标签: javascript function variables variable-assignment


【解决方案1】:

所以只是想出了一个很好的方法来做到这一点:

布尔值,因为其他原始值是按值传递的,但对象是通过引用传递的。 如果它属于一个对象,则传递给函数 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);    

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

【讨论】:

    【解决方案2】:

    函数必须返回一个值。

    function switchValue(v){ 
      return !v;
    }        
    
    var a = true;
    switchValue(a);
    

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

    【讨论】:

    • 而函数switch神奇地知道变量a在哪里?而且这段代码不会运行..
    • 把函数名改成switch()以外的名字,例如switchValue(v)
    【解决方案3】:

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

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

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

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

    【讨论】:

    • 是的,这显然可行,但我真正的问题是我不知道“a”是什么。这只会在运行时知道。所以我不能将作业硬编码为“a”,为了清楚起见,我已经编辑了这个问题..thnx。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-04
      • 2013-11-18
      • 2017-02-02
      • 2012-09-17
      • 2020-10-13
      • 2019-11-07
      • 2020-04-04
      相关资源
      最近更新 更多