You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
小白前端学习 JavaScript 过程中遇到的第一道坎,大概率就是 this 了。曾经我也被 this 搞的非常头大,还看过不少博客,但我觉得大多数文章写的有些复杂或者又引入了一些新的概念,加大了理解难度。本文就站在各位前辈大佬的肩膀上,做一下总结升华,目的就是让大家一次搞定 JavaScript 中的 this。
小白前端学习 JavaScript 过程中遇到的第一道坎,大概率就是 this 了。曾经我也被 this 搞的非常头大,还看过不少博客,但我觉得大多数文章写的有些复杂或者又引入了一些新的概念,加大了理解难度。本文就站在各位前辈大佬的肩膀上,做一下总结升华,目的就是让大家一次搞定 JavaScript 中的 this。
本文会引入的概念
fn
和fn()
不一样就行,fn()
是函数调用call
、apply
、bind
的函数调用就是隐式调用,反之就是显示调用fn = () => {}
这样的函数叫箭头函数就行call
的用法,知道call()
的第一个参数可以指定 fn 的 this 就行,bind
和apply
同理三步确定 this
1. 一“定”——函数调用this定
函数调用的时候确定 this 指向,可以把 this 看成一个隐藏参数。
2. 二“转”——箭头转外,隐式转call
箭头函数调用
看这个函数的类型,如果是箭头函数,看它外面的 this。
普通函数隐式调用
fn(1, 2)
转化成fn.call(undefined, 1, 2)
obj.fn('hello')
转化成obj.fn.call(obj, 'hello')
arr[0]()
转化成arr.0.call(arr, 'x')
来一道综合题一次性说完:
3. 三“特例”——三种特例别踩坑
new 会改变 this
严格模式保持 undefined
严格模式下值为 undefined 的 this 不会变成 window
let const 不会被挂到 window
看完有没有感觉 this 其实也并不难呢?来几道综合题巩固一下吧!
综合题
结合 DOM
答案不是 button,而是不确定,因为都没有调用,怎么知道 this 呢?
可以这么回答:因为没有调用,所以无法确定 this,如果采用隐式调用的话,打印 button,如果使用显示调用,则打印自定义的 this。
超难面试题
这道题有几大坑:let、window.length、arguments.length
所以答案也非常诡异
关于 window.length 的值,可以参见 MDN。
总结
记住一“定”,二“转”,三特例就行,核心是两点:
obj.fn(1)
=obj.fn.call(obj, 1)
这样一来 this 就真相大白了!
参考文章
The text was updated successfully, but these errors were encountered: