【问题标题】:TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict modeTypeError:在严格模式下可能无法访问“调用者”、“被调用者”和“参数”属性
【发布时间】:2021-02-03 13:13:44
【问题描述】:

我是 JS 新手,我从一个互联网论坛获得了以下代码,如果我从下面的 Javascript 类调用该函数,它就不起作用。当我尝试执行时,出现以下错误,我无法弄清楚是什么原因。有人可以帮我解决我在这里缺少的东西吗?

var person1 = {
  FirstName: "First Name1",
  LastName: "Last name1",
  Age: 30,
  EMailAddresses: [
    "FirstName.LastName@msn.com"
  ],
  Children: [{
    FirstName: "Child First Name1",
    LastName: "Child Last Name1",
    Age: 2
  }, {
    FirstName: "Child First Name2",
    LastName: "Child Last Name2",
    Age: 5
  }]
};

var person2 = {
  LastName: "LastName2",
  Age: 33,
  EMailAddresses: [
    "LastName2@gmail.com",
    "LastName2@hotmail.com"
  ],
  Children: [{
    FirstName: "Child First Name1",
    LastName: "Child Last Name1",
    Age: 3
  }, {
    FirstName: "Micky",
    LastName: "Mouse",
    Age: 5
  }]
};



class MasterClass {
  async getDifferencs(objectA, objectB) {

    var propertyChanges = [];
    var objectGraphPath = ["this"];

    (function(a, b) {
      if (a.constructor == Array) {
        for (var i = 0; i < a.length; i++) {
          objectGraphPath.push("[" + i.toString() + "]");
          arguments.callee(a[i], b[i]);

          objectGraphPath.pop();
        }
      } else if (a.constructor == Object || (a.constructor != Number &&
          a.constructor != String && a.constructor != Date &&
          a.constructor != RegExp && a.constructor != Function &&
          a.constructor != Boolean)) {
        for (var property in a) {
          objectGraphPath.push(("." + property));
          if (a[property].constructor != Function) {
            arguments.callee(a[property], b[property]);
          }
          objectGraphPath.pop();
        }
      } else if (a.constructor != Function) { // filter out functions
        if (a != b) {
          propertyChanges.push({
            "Property": objectGraphPath.join(""),
            "ObjectA": a,
            "ObjectB": b
          });
        }
      }
    })(objectA, objectB);
    return propertyChanges;
  }
}

var my_class = new MasterClass();
var differences = my_class.getDifferencs(person1, person2);

console.log(differences);

【问题讨论】:

    标签: javascript


    【解决方案1】:

    (function test() {
      console.log( arguments.callee === test ); // true
    })();

    arguments.callee,指的是函数本身,在严格模式下不可用。您可以为函数命名,并使用该名称作为参考:

    async getDifferencs(objectA, objectB) {
    
      var propertyChanges = [];
      var objectGraphPath = ["this"];
    
      (function _self(a, b) { // <--- (1)
        if (a.constructor == Array) {
          for (var i = 0; i < a.length; i++) {
            objectGraphPath.push("[" + i.toString() + "]");
            _self(a[i], b[i]); // <--- (2)
    
            objectGraphPath.pop();
          }
        } else if (a.constructor == Object || (a.constructor != Number &&
            a.constructor != String && a.constructor != Date &&
            a.constructor != RegExp && a.constructor != Function &&
            a.constructor != Boolean)) {
          for (var property in a) {
            objectGraphPath.push(("." + property));
            if (a[property].constructor != Function) {
              _self(a[property], b[property]); // <--- (3)
            }
            objectGraphPath.pop();
          }
        } else if (a.constructor != Function) {
          if (a != b) {
            propertyChanges.push({
              "Property": objectGraphPath.join(""),
              "ObjectA": a,
              "ObjectB": b
            });
          }
        }
      })(objectA, objectB);
      
      return propertyChanges;
    }
    

    【讨论】:

    • 谢谢!有效。我还尝试将“this”分配给“self”并使用 self 调用该函数,但不知何故它不起作用。非常感谢您的方法为我节省了时间。
    猜你喜欢
    • 2018-05-16
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多