【问题标题】:function writing function in JSJS中的函数编写函数
【发布时间】:2015-05-01 04:06:46
【问题描述】:

由于某种原因,我在 JS 中有必须硬编码的函数。如何制作一个编写这个硬编码函数的函数?这是我的例子;假设 obj 是一个多数组/JSON 对象:

function foo2(obj) {
    var t = obj["key1"];
    t = t["key2"];
    return t;
}

function fooN(obj) {
    var t = obj["key1"];
    t = t["key2"];
    ...//more goes here
    t = t["keyN"];
    return t;
}

我知道访问多数组/对象有更简单的方法,但是像这样的硬编码函数是迄今为止最快的,因为没有变量替换。谢谢。

【问题讨论】:

  • “出于某种原因。” ---这是一个糟糕的理由。当一些不合理的事情需要你编写糟糕的代码时 - 你最好避免它。
  • Premature optimization is the root of all evil. 你分析了吗?你知道你用漂亮的代码执行是不可接受的,而且硬编码的变体足够快吗?现代 JS 解释器速度非常快,即使在较慢的语言中,变量访问也被认为很便宜。
  • new Function。它允许您将正文作为字符串提供,并定义函数。
  • 你不需要一直分配变量。 return obj.key1.key2.key3....keyN
  • 你不认为最流行的 JS 解释器的作者已经尽可能地优化了像对象属性访问这样常见的东西吗?我真的怀疑你的“优化”会做很多事情。如果他们减慢你的代码,我什至不会感到惊讶。

标签: javascript functional-programming hardcode


【解决方案1】:

我不提倡这样做,但您可以这样做:

function defineAccessor(propArray) {
  var accessors = propArray.join('.');
  return new Function('obj', 'return obj.' + accessors);
}
var x = { key1: { key2: 3 } };
var foo2 = defineAccessor(['key1', 'key2']);
alert(foo2(x)); // alerts 3

【讨论】:

    【解决方案2】:

    似乎有些奇怪的要求,但一个可能的解决方案是使用window['foo' + number] 将函数添加到window

    此解决方案中的主要棘手之处在于中间的闭包确保使用正确的 i 值。这是通过调用一个以i 为参数并返回一个函数的函数来完成的。

    var N = 5;
    
    fooX = function(obj, x) {
      var t = obj["key" + 1];
      for (var i = 2; i <= x; i++) {
        t = t["key" + i];
      }
      return t;
    }
    
    for (var i = 1; i <= N; i++) {
      window['foo' + i] = (function(x) {
        return function(obj) {
          return fooX(obj, x);
        }
      })(i);
    }
    
    
    var obj = {
      key1: {
        key2: {
          key3: {
            key4: {
              key5: 5
            }
          }
        }
      }
    }
    
    var message = "Results:<br>" +
      "foo1(obj) = " + foo1(obj) + "<br>" +
      "foo2(obj) = " + foo2(obj) + "<br>" +
      "foo3(obj) = " + foo3(obj) + "<br>" +
      "foo4(obj) = " + foo4(obj) + "<br>" +
      "foo5(obj) = " + foo5(obj);
    
    document.body.innerHTML = message;

    【讨论】:

    • 他想要访问深度嵌套的属性,而不是同一个对象的不同属性。
    • @Barmar 啊,修好了。
    猜你喜欢
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 2021-08-08
    • 2011-01-08
    • 2021-12-04
    • 2017-02-02
    • 2021-03-06
    • 1970-01-01
    相关资源
    最近更新 更多