1

我真的很难理解这个概念,我想如果我在自己的代码上看到它可能会点击它。我真的很想利用回调函数,同时仍然保持面向对象的方法。感谢您提供的任何帮助!

//adds functionality to buttons
    addClickEvent(newDataCollect,function() {addClickEvent(dataSubmitBtn, function(){testAjax(dataForm.elements);});

        function addClickEvent(elem,click,addtl) {
            var nwClickEvent = new elemEvents(elem,click,addtl);
            nwClickEvent.onClick();
      }

      //add click event object & properties
      function elemEvents(elem,click,addtl) {
        this.elem = elem;
        this.click = click;
        this.addtl = addtl;
      }

      //add click event object method
      elemEvents.prototype = {
        onClick: function() {this.elem.onclick = this.click;}
      }
4

2 回答 2

0

是的,我会说您已经在使用回调:

//add click event object & properties (constructors should be PascalCase)
function ElemEvents(elem,click,addtl) {
    this.elem = elem;
    // `click` should be a function, and as such, a callback that is called when the element is clicked
    this.elem.onclick = click;
    this.addtl = addtl;
}

// later:
var e = new ElemEvents(
    // the `elem`
    document.getElementById("id"),

    // this is the callback.
    function (event) {
        console.log("hi from event: " + event);
    },
    // the `addtl`.
    "");
于 2013-11-16T11:23:58.657 回答
0

这里要记住的一件事是回调不一定是异步的。在这种特殊情况下,您正在定义一个onClick处理程序,该处理程序将在用户单击某物时运行,在将来的某个时间点。这是异步的 - 但请考虑以下事项:

function log(/* .. */){ // can be any arguments, we're just .apply'ing log with arguments
  console.log.apply(console, arguments)
}

function logThen(done /* .. */) { // takes a callback as first argument, then vals to log
  var args = [].splice.call(arguments, 1); // calls splice on the arguments, removing the CB, and returning whatever you had left
  console.log.apply(console, args);
  if (done && typeof done === 'function'){
    done();
  }
}

log(1);
log(2);
log(3);
logThen(alert, 4);
log(5);
log(6);

输出将是:

1
2
3
4  // shows an alert, then continues with.. 
5
6

这都是同步代码 - 没有任何东西被推送到下一个调用堆栈,因此它会alert同步执行所有内容,包括您的回调(在这种情况下)。

只是有点抬头!

于 2013-11-16T11:52:35.053 回答