这三种监听事件的方式的作用域有何不同
How the does scope differ between these three ways of listening for events?
假设函数doSomething()
是在同一个地方定义的,那么函数在执行时的作用域在这三种侦听事件的方法之间是否不同?
<body onload="doSomething();">
document.body.onload = doSomething;
document.body.addEventListener('load', doSomething);
与addEventListener()
相比,除了属性只能包含一个"侦听器"之外,以这三种方式侦听事件之间还有其他区别吗?(例如传入的参数,或this
的值?)
onload="doSomething();"
与类似
document.body.onload = function(event) {
doSomething();
};
在事件处理程序本身内部,this
指的是处理程序绑定到的元素,但在doSomething
内部,this
将指的是window
,因为您正在"正常"调用函数。doSomething
也无法访问事件对象。如果你想让doSomething
和其他情况一样工作,你必须传递this
和event
:
onload="doSomething.call(this, event);"
注意:document
、祖先DOM元素和DOM元素本身的属性都在事件处理程序的范围内(而不是doSomething
),这可能会导致非常混乱的行为。请在此处查看我的答案以了解更多信息。
document.body.onload = doSomething;
和document.body.addEventListener('load', doSomething);
在作用域和上下文方面是等效的,它们没有内联事件处理程序所具有的这种奇怪的作用域行为。
有关不同方式的更多信息,请访问quicksmode.org。
相关文章:
- 监视函数从服务返回不起作用,但作用域函数起作用
- 将作用域存储在JSON中
- 从控制器继承了隔离的作用域以生成可重用的指令
- 从ng模板访问作用域
- 调用私有作用域
- 对父作用域的指令更新延迟了一步
- 正在$rootScope上达到控制器作用域$在内部控制器上
- 如何以正确的方式从服务中设置作用域变量
- Javascript”;这个“;作用域根据调用方式给出不同的结果
- Angular.js——在作用域中使用函数的优雅方式
- 在AngularJS的1.3和2版中创建指令作用域的方式是一样的
- 使用$compile以编程方式添加指令,并从作用域传递数据
- 访问AngularJS隔离作用域的另一种方式
- Dojo:正确的方式'Hitch'延迟类型的作用域
- 隔离作用域2的方式绑定不会更新父作用域的值
- 什么是正确的方式来指示你的作用域,你的谷歌api已经加载
- 了解作用域,点击和角度方式
- 是否可以以外部作用域不可见的方式声明/调用函数
- 这三种监听事件的方式的作用域有何不同
- Javascript变量作用域的确切工作方式