2 回答
![?](http://img1.sycdn.imooc.com/545862e700016daa02200220-100-100.jpg)
TA贡献1789条经验 获得超10个赞
关于this
价值观。
箭头函数捕获并始终使用它们的词法
this
值,这意味着在评估它们的箭头函数表达式时有效的那个值。求值通常发生在执行赋值操作或为参数列表中有箭头函数的函数调用计算参数值时。箭头函数不能用作构造函数。
绑定函数保存并使用
this value
提供的作为另一个函数bind
方法的第一个参数。this
如果作为构造函数调用,绑定函数会忽略它们保存的值 - 但这种情况很少被视为边缘情况,通常 不推荐使用。绑定箭头函数对其
this
值没有影响,但可用于预定义一组参数值。使用它们的
call
或apply
对象方法调用的this
函数从thisValue
提供给call
or的(第一个)参数中获取它们的值apply
,受 JavaScript 模式约束:在严格模式
null
或undefined
提供thisValue
的this
值用作函数的值。然而在草率模式下,null
或在拨打电话之前undefined
被替换window
。可以使用这些方法(例如提供参数)调用箭头和绑定函数,但使用它们自己的记录
this
值。如果上述规则均不适用,则作为对象方法显式调用的函数将使用该对象作为其
this
值。EG 形式调用
someObject.methodName( optionalArgumentList)
this
inmethodName
是指someObject
该方法是否为常规函数。在严格模式下,
this
非限定函数调用中的默认值为undefined
。在草率模式下(从首次引入 JavaScript 开始)this
是window
. 演示:
代码中调用全球提供的文本字符串函数的构造,
SetTimeout
,相关的计时器调用,并在HTML源事件的属性,被视为自己的权利“脚本”,并创建了一个功能虽然这会改变函数的默认
this
值,但这也是一种边缘情况,因为在编写可维护的代码时,不推荐使用这些创建函数的方法。如果提供的源代码未调用严格模式,则以草率模式运行,
如果在源中调用严格模式,则以严格模式运行。
this
评估代码时的值eval
超出了这个问题的范围,但为了完整性:这也是一个边缘情况,因为它的危险性,
eval
不应该被使用,因为你可以。直接调用从调用上下文
eval
继承this
,除非评估的代码调用严格模式 - 在这种情况下this
是undefined
在代码评估期间。间接调用
eval
使用window
(即全局对象),this
即使它们调用严格模式(Ref。)
HTML 中的内联事件处理程序
表单的 HTML 标记中的事件处理程序内容属性
onEventName="text"
由HTML 解析器使用等效于的步骤转换为事件处理函数
将文本保存为属性的字符串值。
使用 JavaScript 解析器/编译器通过将文本包含在表单模板中来从文本创建事件处理程序函数
function( event) { // include attribute text here as body code }
将函数另存为与属性同名的元素的属性。EG 在这一点上,具有
onclick
文本属性的元素也将具有作为onclick
函数的属性。将该函数添加到元素的内部事件处理程序映射。 实际上,这意味着实际的事件处理使用侦听器映射,而不是在元素上查找处理函数。
警告
HTML onEventName 属性早于 DOM 的标准化和引入
addEventListener
:HTML 解析器创建的处理程序有一个遗留范围链,它最低限度地搜索事件属性所属的元素、周围
form
元素(如果有的话)以及document
在查找名称时到达全局对象之前的对象 - 这可能会导致模糊的错误。
问题 1
为什么inline onlick,我们必须写onclick="hello()",但是在JS中,我们应该写btn.onclick=hello or btn.addEventListener('click',hello);
HTML 事件处理程序属性用作由 HTML 解析器创建的事件处理程序函数的主体代码。要调用hello
,属性文本必须提供进行调用的源代码,例如hello()
。
在 JS 中,将 an 设置onclick
为函数对象,或addEventListener
将函数作为第二个参数调用,会将函数添加到与元素关联的处理程序映射中。如果括号放在函数名之后,onclick
例如:
onclick = myFunction();
调用该函数并尝试将其返回值用作处理函数 - 如果返回值不是函数,则很少发生。大多数情况下,这是一个错误,而不是预期的结果。
问题2
对于常规函数,为什么内联onclick中,“this”指的是窗口,而js调用时,“this”指的是按钮。
在从内联 onclick 属性创建的事件处理函数内部,this
确实引用了按钮。如果你用类似的代码调用另一个函数hello()
,你就是在对它进行不合格的调用,所以被调用的函数使用它的默认this
值——即,window
如果被调用的函数在草率模式下运行。
从“在HTML内嵌事件处理程序”下面,你可以通过对this
(指按钮)和event
对象,如果你想一个参数值:
onclick="hello(this, event)"
JavaScript 中提供的处理程序函数直接进入元素的事件处理程序映射,并由事件系统以按钮作为其this
值调用(可能使用call
或apply
,因为添加的处理程序addEventListener
不作为元素属性值维护)。
问题 3
<button onclick="function tes(){console.log(this)}tes()">button>/button>
创建事件处理函数
function onclick(event) { function tes(){ console.log(this) } tes() }
在按钮标记的事件属性文本中未调用严格模式,因此onclick
和 tes
都处于草率模式。tes
被无条件调用,因此它使用并记录其默认this
值window
.
关于“关于这个值”,规则 1-5 均不适用,因此规则 6 生效。
问题 4
<button onclick="console.log(this)">button</button>
创建处理函数
function onclick(event) { console.log(this) }
this
事件系统将按钮元素作为其值调用它,就像它对任何其他处理程序一样。console.log
正在显示日志中按钮的外部 HTML。如果您更改this
为字符串,日志将告诉您它是一个 HTMLButtonElement 元素:
<button onclick="console.log(this.toString())">button</button>
添加回答
举报