【发布时间】:2019-09-13 02:31:42
【问题描述】:
我很困惑:
为什么用内联onlick,我们必须写onclick="hello()",但是在JS中,我们应该写btn.onclick=hello或者btn.addEventListener('click',hello);
对于常规函数,为什么用inline onlick,“this”是指窗口,而用js调用,“this”是指按钮。
我不明白最后两个按钮
根据 w3school,在函数中,this 指的是全局对象。 https://www.w3schools.com/js/js_this.asp
在常规函数中,this 关键字表示调用函数的对象,可以是窗口、文档、按钮或其他任何东西。 https://www.w3schools.com/js/js_arrow_function.asp
const arrayBtn = document.querySelector(".arrowFunc");
const regBtn = document.querySelector(".regFunc");
hello = () => console.log("i am arrow function" + this);
function hiii(){
console.log("i am regular function" + this);
}
arrayBtn.addEventListener("click", hello);
regBtn.addEventListener("click", hiii);
<button onclick="hello()">This calls an arrow function with an inline onclick</button>
<button class="arrowFunc">This calls an arrow function with event listener</button>
<button onclick="hiii()">This calls an regular function with an inline onclick</button>
<button class="regFunc">This calls an regular function with event listener</button>
<button onclick="function tes(){console.log(this)}tes()">button</button>
<button onclick="console.log(this)">button</button>
[Log] i am arrow function[object Window] <br>
[Log] i am arrow function[object Window] <br>
[Log] i am regular function[object Window] <br>
[Log] i am regular function[object HTMLButtonElement] <br>
[Log] Window {document: #document, window: Window, NaN: NaN, nalert: function, obj: {name: "my_obj"}, …} <br>
[Log] <button onclick="console.log(this)">button</button>
【问题讨论】:
-
即使做了多年的开发人员,我也对此感到困惑!
-
另外,尝试链接 MDN 而不是 W3Schools 作为来源。它更正式。
-
了解什么?您已经写了如何解释
this上下文。this,在常规函数中,在对象的方法 (function) 内,指的是对象,在事件的情况下是元素。所以分配给Element的onclick的函数就是方法,按钮就是Object。箭头函数内的this的作用域直到您的最后一个作用域,如果不在类或构造函数内,则为全局。请注意,构造函数是一个函数。它只有在调用new时才成为对象。
标签: javascript html onclick this onclicklistener