【问题标题】:Set window variable value in by a function通过函数设置窗口变量值
【发布时间】:2016-12-03 21:08:36
【问题描述】:

我想通过函数设置window.userName变量值,但是失败了:

function changeName(variable) {
 variable = "Bill";
}

changeName( window.userName );

console.log( window.userName ); // outputs undefined

我如何将 window.userName 变量引用传递给函数,或者您建议用它做什么?

任何帮助将不胜感激。谢谢!

这里是代码 sn-p,向您展示了该操作的主要思想:

var data = [{
  "name": "Bill",
  "location": {
    "latitude": "12.4124",
    "human_address": {
      "address": "Blabla St. 13",
      "city": "Moscow"
    },
    "longitude" : "51.2512"
  }
},
{
  "name": "James",
  "location": {
    "human_address": {
      "city": "Moscow"
    }
  }
}];

var allColumns = {};

function loopInto(targetObj, obj) {
  for (var k in obj) {
    if (!(k in targetObj)) {
      targetObj[k] = true;
    }
    if (typeof obj[k] == "object") {
      if (targetObj[k] == true)
        targetObj[k] = {};
      loopInto(targetObj[k], obj[k]);
    }
  }
}

for (i=0; i<data.length; i++) {
  for (var k in data[i]) {
    if (!(k in allColumns)) {
      allColumns[k] = true;
    }
    if (typeof data[i][k] == "object") {
      if (allColumns[k] == true)
        allColumns[k] = {};
      loopInto(allColumns[k], data[i][k]);
    }
  }
}

console.log( allColumns );

如您所见,我可以通过引用传递allColumns[k] 对象,然后通过loopInto 函数更改其值。但是为什么我不能对例如做同样的事情? window.allColumns 变量?如果您尝试将allColumns 替换为window.allColumns,则会失败。

【问题讨论】:

    标签: javascript oop scope


    【解决方案1】:

    问题是所有 Javascript 变量都是按值传递的,而不是按引用传递的。 (对象类型是例外。)这意味着您实际上复制了window.userName 属性的。在函数内修改variable变量只在函数内生效。

    没有办法改变这种行为。您可以做的一件事是修改函数,以便它可以 n 取一个对象和一个属性名。例如:

    function changeName(obj, prop) {
        obj[prop] = 'Bill';
    }
    

    因为对象通过引用传递的(嗯,有点),所以在函数内为对象设置属性也会在外部影响它。所以你可以做changeName(window, 'userName')

    但我不会。将数据从函数发送到脚本的其余部分的正常方法是 returning 它。更惯用的方法如下所示:

    function getName() {
        return "Bill";
    }
    window.userName = getName();
    

    【讨论】:

    • 请预览我编辑的问题,让我知道你的想法。谢谢!
    【解决方案2】:

    在Javascript中,不能将变量作为参数,直接在函数中给变量赋值。

    可以将对象作为参数并更改对象,但不能使用assignment operator 分配某些值,例如=

    您可以将对象和属性分开并同时获取,第一个作为引用,第二个作为函数的字符串,并通过赋值更改值。

    function changeName(reference, key) {
        reference[key] = 'Bill';
    }
    
    changeName(window, 'userName');
    console.log(window.userName); // Bill

    【讨论】:

      【解决方案3】:

      原因不是窗口变量,与 JSON.parse() 方法相关的函数中存在一些错误...

      但是,如果有人想要遍历 JSON,请从中获取所有属性名称并放入新的 JSON 变量 (window.allColumns),以下代码可能对您有所帮助:

      var data = [{
        "name": "Bill",
        "location": {
          "latitude": "12.4124",
          "human_address": {
            "address": "Blabla St. 13",
            "city": "Moscow"
          },
          "longitude" : "51.2512"
        }
      },
      {
        "name": "James",
        "location": {
          "human_address": {
            "city": "Moscow"
          }
        }
      },
      {
        "entityname" : "Tarararararara",
        "location" : {
          "latitude" : "40.279644",
          "human_address": {
            "address": "Space",
            "city": "Mars",
            "state": "LA",
            "zip": "3"
          }
        }
      }];
      
      window.allColumns = {};
      
      function strIsJSON(str) {
        try {
          JSON.parse(str);
        } catch (e) {
          return false;
        }
        return typeof JSON.parse(str) == "object" ? true : false;
      }
      
      function loopInto(targetObj, obj) {
        for (var k in obj) {
          if (!(k in targetObj)) {
            targetObj[k] = true;
          }
          if (typeof obj[k] == "object" || strIsJSON(obj[k])) {
            if (targetObj[k] === true && typeof targetObj[k] != "object")
              targetObj[k] = {};
            if (typeof obj[k] == "object")
              loopInto(targetObj[k], obj[k]);
            else
              loopInto(targetObj[k], JSON.parse(obj[k]));
          }
        }
      }
      for (i=0; i<data.length; i++) {
        for (var k in data[i]) {
          if (!(k in window.allColumns)) {
            window.allColumns[k] = true;
          }
          if (typeof data[i][k] == "object" || strIsJSON(data[i][k])) {
            if (window.allColumns[k] === true && typeof window.allColumns[k] != "object")
              window.allColumns[k] = {};
            if (typeof data[i][k] == "object")
              loopInto(window.allColumns[k], data[i][k]);
            else
              loopInto(window.allColumns[k], JSON.parse(data[i][k]));
          }
        }
      }
      
      console.log( window.allColumns );

      【讨论】:

        猜你喜欢
        • 2013-10-21
        • 2011-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-03
        相关资源
        最近更新 更多