我已经打开了有关Function.prototype.bind的MDN文档,但我的脚本仍无效。
我希望this
引用添加到addEventListener的htmlElement。问题是,为什么我的this
引用了对象窗口。
这里是没有绑定的脚本(http://jsbin.com/ejimor/1/edit):
var handle1 = document.getElementById('handle1'),
handle2 = document.getElementById('handle2');
function doLogin() {
alert(this);
}
function enterForm(ev) {
if ( ev.which === 13 ) {
doLogin();
}
}
handle1.addEventListener('click', doLogin, false);
// this alert: [object HTMLButtonElement] this is what i want
handle2.addEventListener('keyup', enterForm, false);
// this alert: [object Window] this is what i do not want
那么,如何解决这个问题呢?
答案 0 :(得分:3)
诀窍是,您希望在调用doLogin
的上下文中调用enterForm
,因为您可以使用call
或apply
:
function enterForm(ev) {
if (ev.which === 13) doLogin.call(this);
}
call
和apply
确保调用它们的函数内的this
被设置为传递给它们的第一个参数(因此我们可以调用doLogin.call({x: 1})
并获得[object Object]
的警报,例如)。
如果您始终希望在doLogin
的上下文中调用HTMLButtonElement
,则可以使用bind
将该函数替换为相同函数的绑定版本:
function doLogin() { alert(this); }
doLogin = doLogin.bind(handle1);
bind
创建一个新版本的函数,this
永久绑定到传递给它的第一个参数。所以,同样,如果我们这样做:
var newLogin = doLogin.bind({x: 1});
每次调用newLogin
时,都会调用this
上下文设置为我们的匿名{x: 1}
对象(即使我们newLogin.call(12)
或newLogin.apply(someObject)
)