对象方法

时间:2016-04-20 14:16:58

标签: javascript function callback this

有一段代码:

var object = {
    findById: function(idNumber) {
        var data = this.childNodes;
        var returnItems = {};

        function callback(node) {
            if (parseInt(node.id) === idNumber)
                returnItems = node;
        };

        function iterator(node, callback) {
            callback(node);
            var nodes = node.childNodes;
            if (nodes === undefined) {
                return;
            };
            for (var i = 0; i < nodes.length; i++) {
                var iterNode = nodes[i];
                iterator(iterNode, callback);
            };
        };

        function bind(func, context) {
            return function() { // (*)
                return func.apply(context, arguments);
            };
        };

        for (var i = data.length - 1; i >= 0; i--) {
            iterator(data[i], callback);
        };

        return returnItems;
    },
}

如何将上下文导入迭代器和回调函数? 如果我将console.log(this)放入函数iterator() - 这将是&#39; window&#39;,而不是我的对象。 它也不应该是this.callback this.iterator等。 据我所知,它应该像call / apply或bind。 怎么做?

2 个答案:

答案 0 :(得分:0)

无论你在哪里使用函数都是这样做的:

functionToCall.apply(this,params); //this or the context you want to have inside

样品:

function callable() {
   console.log(this);
}
callable(); //logs window
callable.apply({}); //logs {}

答案 1 :(得分:0)

  1. findById函数中复制对此的引用。

    var object = {
      findById: function(idNumber) {
        var data = this.childNodes;
        var returnItems = {};
    
        // assign this to a variable
        // you can use inside the nested functions
        var that = this;
    
    
        function callback(node) {
          if (parseInt(node.id) === idNumber)
            returnItems = node;
        };
    
        function iterator(node, callback) {
          callback(node);
          var nodes = node.childNodes;
          if (nodes === undefined) {
            return;
          };
          for (var i = 0; i < nodes.length; i++) {
            var iterNode = nodes[i];
            iterator(iterNode, callback);
          };
        };
    
        function bind(func, context) {
          return function() { // (*)
            return func.apply(context, arguments);
          };
        };
    
    
        for (var i = data.length - 1; i >= 0; i--) {
          iterator(data[i], callback);
        };
    
        return returnItems;
      }
    };
    
  2. 使用callapply

    for (var i = data.length - 1; i >= 0; i--) {
      iterator.call(this, data[i], callback);
    };