我只是想知道是否可以实现这样的目标:
假设我的库中定义了一个事件回调:
var app = {
globals: {
foo: null
},
bar: function(e) {
e.preventDefault();
e.stopPropagation();
if (typeof app.globals.foo === "function") app.globals.foo(e);
},
init: function(options) {
$.extend(app.globals, options);
$(".myclass").on("click", function(e) {
app.bar(e);
});
}
};
$(document).ready(function() {
app.init({
foo: function(evt) {
alert("clicked");
console.log(evt.target);
}
});
});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="myclass">Click Me!</div>
&#13;
通过这种方法,我传递了&#34; .myclass&#34;元素&#39;单击事件数据到app.foo
,因此将执行面向对象的方法。
TL; DR:问题是,我可以将foo的范围设置为发送click事件的对象吗?所以:
app.init({
foo: function(){
console.log(this);
}
});
将执行与:
相同app.init({
foo: function(evt){
console.log(evt.target);
}
});
这样的事情可能吗?
答案 0 :(得分:1)
您可以控制激活时this
功能的foo
值:
// ...
if(typeof app.globals.foo === "function") app.globals.foo.call(e.target);
// ...
将this
设置为等于e.target
并且您将获得您描述的行为,但是......
这样做不是一个好习惯。首先,如果foo
绑定到特定的this
(例如通过foo.bind(someContext)
,则此方法将无法覆盖该上下文。其次,拥有{{1}是不自然的当没有真正的对象上下文时,上下文 - 那是什么函数参数被使用。&#34;常见异常&#34;对此(通常在jQuery回调中找到)将上下文传递给一个&#34;隔离&#34;回调函数,而不是&#34;对象方法&#34;,即使这样,由于同样的原因很难证明这一点,函数参数更清晰,更不易碎