javascript:如何更改"这个“;事件的作用域
javascript : how to change "this" scope on an event
我已经打开了关于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
那么,如何解决这个问题呢?
诀窍是,您希望在调用enterForm
的上下文中调用doLogin
,为此您可以使用call
或apply
:
function enterForm(ev) {
if (ev.which === 13) doLogin.call(this);
}
call
和apply
确保它们被调用的函数内部的this
被设置为传递给它们的第一个参数(例如,我们可以调用doLogin.call({x: 1})
并获得[object Object]
的警报)。
如果您总是希望在HTMLButtonElement
的上下文中调用doLogin
,则可以使用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)
)
相关文章:
- "这个“;函数的作用域无效
- 尝试重新使用“;这个“;属性,则它将失去作用域
- javascript:如何更改"这个“;事件的作用域
- 为什么在这个嵌套的作用域示例中使用extra符号
- "这个“;正在失去其父Core的作用域
- Javascript”;这个“;作用域根据调用方式给出不同的结果
- javascript中的作用域是如何工作的?为什么这个功能有效
- Javascript:这个变量放在哪个作用域中
- javascript中的这个属性作用域
- 使用这个/bind的JS原型作用域
- 如何用变量作用域解释这个问题
- 使用& # 39;var # 39;和& # 39;这个# 39;在node.js程序的全局作用域中
- 当AngularJS触发$onEval时,是否有办法立即知道这个作用域中的哪些值发生了变化?
- 获得正确的“;这个“;上的jQuery中的作用域
- 为什么匿名函数不拾取这个对象的包含作用域?
- 为什么Angular JS控制器中的这个from作用域变量不被设置为true ?
- 我是否需要为这个指令设置一个单独的作用域?
- & # 39;这个# 39;ES6和Knockout的作用域
- 我怎样才能使用两个不同的作用域;这个";在一个功能中
- 这个简单的javascript脚本实际上是如何工作的(可能是作用域)