我正在阅读 John Resig 的“Javascript Ninja 的秘密”,其中他谈到了更改事件处理程序的上下文。在其中,他有以下代码。我不知道它为什么起作用。非常迷失这一点。
<body>
<button id="test">Click Me!</button>
<script>
function bind(context,name){ //#1
return function(){ //#1
return context[name].apply(context,arguments); //#1
}; //#1
} //#1
var button = {
clicked: false,
click: function(){
this.clicked = true;
alert('It has been clicked! The value of clicked is ' + clicked);
}
};
var elem = document.getElementById("test");
elem.addEventListener("click",bind(button,"click"),false); //#2
</script>
</body>
即我不了解绑定函数本身,并且我不明白为什么它需要在匿名函数中表达。因为如果我删除 bind() 函数并尝试以下任何操作,我总是会收到错误消息“点击未定义”。对我来说,它们中的任何一个都可以通过将“this”参数分配给按钮对象来工作,从而可以访问其 clicked 属性:
elem.addEventListener("click",button.click.apply(button),false);
在下一个案例中,我说的是 javascript 的原生“绑定”函数
elem.addEventListener("click",button.click.bind(button),false);
据我所知,下一条语句将是 John Resig 的 bind() 函数返回的内容
elem.addEventListener("click",function() { button.click.apply(button, arguments)},false);
但是等等,John Resig 的绑定函数中有两个返回语句。在这一点上,我只是在猜测——下一个呢?
elem.addEventListener("click",function() { return button.click.apply(button, arguments)},false);
以上陈述均无效。
其次,为什么bind函数有两个return语句?在我看来,bind 的工作方式如下:
function bind(context,name){
return function(){ context[name].apply(context,arguments); };
}
第三,如果我使用 John Resig 的绑定函数并尝试将其分配给一个变量,比如变量 ninja,如下所示:
var ninja = bind(button,"click");
ninja;
我希望看到返回给我的函数如下所示:
function(){ button["click"].apply(button,arguments);
因为 context 和 name 的值将通过闭包填充。但它看起来像:
function(){ context[name].apply(context,arguments);
所以......我希望我对所有这些问题感到困惑的根本原因源于我所缺少的相同基本概念。想法?