mirror of
https://github.com/ZiuChen/ZiuChen.github.io.git
synced 2025-09-11 05:03:46 +08:00
164 lines
62 KiB
HTML
164 lines
62 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en-US" dir="ltr">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||
<title>一文读懂函数中this指向问题 | ZiuChen</title>
|
||
<meta name="description" content="Unlimited Progress.">
|
||
<meta name="generator" content="VitePress v1.0.2">
|
||
<link rel="preload stylesheet" href="/assets/style.DyLAZvhs.css" as="style">
|
||
|
||
<script type="module" src="/assets/app.vJk6pPuj.js"></script>
|
||
<link rel="preload" href="/assets/inter-roman-latin.Bu8hRsVA.woff2" as="font" type="font/woff2" crossorigin="">
|
||
<link rel="modulepreload" href="/assets/chunks/framework.BFSS5Pox.js">
|
||
<link rel="modulepreload" href="/assets/chunks/theme.DUrjvOse.js">
|
||
<link rel="modulepreload" href="/assets/article_一文读懂函数中this指向问题.md.CIya3m9M.lean.js">
|
||
<link rel="icon" href="/logo.png">
|
||
<script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
|
||
<script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
|
||
</head>
|
||
<body>
|
||
<div id="app"><div class="Layout" data-v-f671d7ba><!--[--><!--]--><!--[--><span tabindex="-1" data-v-9cf4b56d></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-9cf4b56d> Skip to content </a><!--]--><!----><header class="VPNav" data-v-f671d7ba data-v-97c90b19><div class="VPNavBar has-sidebar top" data-v-97c90b19 data-v-0cb08791><div class="wrapper" data-v-0cb08791><div class="container" data-v-0cb08791><div class="title" data-v-0cb08791><div class="VPNavBarTitle has-sidebar" data-v-0cb08791 data-v-c09fb13e><a class="title" href="/" data-v-c09fb13e><!--[--><!--]--><!--[--><img class="VPImage logo" src="/logo.png" alt data-v-8f5b0db9><!--]--><span data-v-c09fb13e>ZiuChen</span><!--[--><!--]--></a></div></div><div class="content" data-v-0cb08791><div class="content-body" data-v-0cb08791><!--[--><!--]--><div class="VPNavBarSearch search" data-v-0cb08791><!--[--><!----><div id="docsearch"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-0cb08791 data-v-75cc75e8><span id="main-nav-aria-label" class="visually-hidden" data-v-75cc75e8>Main Navigation</span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/" tabindex="0" data-v-75cc75e8 data-v-e85715ee><!--[--><span data-v-e85715ee>首页</span><!--]--></a><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-75cc75e8 data-v-ca9929cf><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-ca9929cf><span class="text" data-v-ca9929cf><!----><span data-v-ca9929cf>我的项目</span><span class="vpi-chevron-down text-icon" data-v-ca9929cf></span></span></button><div class="menu" data-v-ca9929cf><div class="VPMenu" data-v-ca9929cf data-v-9b09dcb5><div class="items" data-v-9b09dcb5><!--[--><!--[--><div class="VPMenuLink" data-v-9b09dcb5 data-v-159aa602><a class="VPLink link" href="/project/ClipboardManager/" data-v-159aa602><!--[-->超级剪贴板<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-9b09dcb5 data-v-159aa602><a class="VPLink link" href="/project/Markdown/" data-v-159aa602><!--[-->超级Markdown<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-9b09dcb5 data-v-159aa602><a class="VPLink link" href="/project/JSRunner/" data-v-159aa602><!--[-->超级JavaScript<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-9b09dcb5 data-v-159aa602><a class="VPLink link" href="/project/SmartWordBreak/" data-v-159aa602><!--[-->超级分词<!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-75cc75e8 data-v-ca9929cf><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-ca9929cf><span class="text" data-v-ca9929cf><!----><span data-v-ca9929cf>开源作品</span><span class="vpi-chevron-down text-icon" data-v-ca9929cf></span></span></button><div class="menu" data-v-ca9929cf><div class="VPMenu" data-v-ca9929cf data-v-9b09dcb5><div class="items" data-v-9b09dcb5><!--[--><!--[--><div class="VPMenuLink" data-v-9b09dcb5 data-v-159aa602><a class="VPLink link" href="/works/opensource.html" data-v-159aa602><!--[-->个人作品<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-9b09dcb5 data-v-159aa602><a class="VPLink link" href="/works/contribution.html" data-v-159aa602><!--[-->社区贡献<!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-75cc75e8 data-v-ca9929cf><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-ca9929cf><span class="text" data-v-ca9929cf><!----><span data-v-ca9929cf>学习笔记</span><span class="vpi-chevron-down text-icon" data-v-ca9929cf></span></span></button><div class="menu" data-v-ca9929cf><div class="VPMenu" data-v-ca9929cf data-v-9b09dcb5><div class="items" data-v-9b09dcb5><!--[--><!--[--><div class="VPMenuLink" data-v-9b09dcb5 data-v-159aa602><a class="VPLink link" href="/note/JavaScript.html" data-v-159aa602><!--[-->JavaScript基础<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-9b09dcb5 data-v-159aa602><a class="VPLink link" href="/note/CSS.html" data-v-159aa602><!--[-->CSS基础<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-9b09dcb5 data-v-159aa602><a class="VPLink link" href="/note/JavaScriptEnhanced.html" data-v-159aa602><!--[-->JavaScript进阶<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-9b09dcb5 data-v-159aa602><a class="VPLink link" href="/note/Front-end%20Engineering.html" data-v-159aa602><!--[-->前端工程化<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-9b09dcb5 data-v-159aa602><a class="VPLink link" href="/note/SSR.html" data-v-159aa602><!--[-->服务端渲染<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-9b09dcb5 data-v-159aa602><a class="VPLink link" href="/note/React.html" data-v-159aa602><!--[-->React基础<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-9b09dcb5 data-v-159aa602><a class="VPLink link" href="/note/React%20Hooks.html" data-v-159aa602><!--[-->React Hooks<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-9b09dcb5 data-v-159aa602><a class="VPLink link" href="/note/Redux.html" data-v-159aa602><!--[-->Redux<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-9b09dcb5 data-v-159aa602><a class="VPLink link" href="/note/React%20Router.html" data-v-159aa602><!--[-->React Router<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-9b09dcb5 data-v-159aa602><a class="VPLink link" href="/note/MySQL.html" data-v-159aa602><!--[-->MySQL<!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/self/" tabindex="0" data-v-75cc75e8 data-v-e85715ee><!--[--><span data-v-e85715ee>个人介绍</span><!--]--></a><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-0cb08791 data-v-fe0c5a7f><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="Switch to dark theme" aria-checked="false" data-v-fe0c5a7f data-v-1eb230f1 data-v-919ad32b><span class="check" data-v-919ad32b><span class="icon" data-v-919ad32b><!--[--><span class="vpi-sun sun" data-v-1eb230f1></span><span class="vpi-moon moon" data-v-1eb230f1></span><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-0cb08791 data-v-e0cb7db2 data-v-444830cf><!--[--><a class="VPSocialLink no-icon" href="https://github.com/ZiuChen" aria-label="github" target="_blank" rel="noopener" data-v-444830cf data-v-30a56c3c><span class="vpi-social-github" /></a><a class="VPSocialLink no-icon" href="https://juejin.cn/user/1887205216238477" aria-label target="_blank" rel="noopener" data-v-444830cf data-v-30a56c3c><svg width="36" height="28" viewBox="0 0 36 28" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M17.5875 6.77268L21.8232 3.40505L17.5875 0.00748237L17.5837 0L13.3555 3.39757L17.5837 6.76894L17.5875 6.77268ZM17.5863 17.3955H17.59L28.5161 8.77432L25.5526 6.39453L17.59 12.6808H17.5863L17.5825 12.6845L9.61993 6.40201L6.66016 8.78181L17.5825 17.3992L17.5863 17.3955ZM17.5828 23.2891L17.5865 23.2854L32.2133 11.7456L35.1768 14.1254L28.5238 19.3752L17.5865 28L0.284376 14.3574L0 14.1291L2.95977 11.7531L17.5828 23.2891Z" fill="#1E80FF"/></svg></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-0cb08791 data-v-91cf9ffd data-v-ca9929cf><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-ca9929cf><span class="vpi-more-horizontal icon" data-v-ca9929cf></span></button><div class="menu" data-v-ca9929cf><div class="VPMenu" data-v-ca9929cf data-v-9b09dcb5><!----><!--[--><!--[--><!----><div class="group" data-v-91cf9ffd><div class="item appearance" data-v-91cf9ffd><p class="label" data-v-91cf9ffd>Appearance</p><div class="appearance-action" data-v-91cf9ffd><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="Switch to dark theme" aria-checked="false" data-v-91cf9ffd data-v-1eb230f1 data-v-919ad32b><span class="check" data-v-919ad32b><span class="icon" data-v-919ad32b><!--[--><span class="vpi-sun sun" data-v-1eb230f1></span><span class="vpi-moon moon" data-v-1eb230f1></span><!--]--></span></span></button></div></div></div><div class="group" data-v-91cf9ffd><div class="item social-links" data-v-91cf9ffd><div class="VPSocialLinks social-links-list" data-v-91cf9ffd data-v-444830cf><!--[--><a class="VPSocialLink no-icon" href="https://github.com/ZiuChen" aria-label="github" target="_blank" rel="noopener" data-v-444830cf data-v-30a56c3c><span class="vpi-social-github" /></a><a class="VPSocialLink no-icon" href="https://juejin.cn/user/1887205216238477" aria-label target="_blank" rel="noopener" data-v-444830cf data-v-30a56c3c><svg width="36" height="28" viewBox="0 0 36 28" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M17.5875 6.77268L21.8232 3.40505L17.5875 0.00748237L17.5837 0L13.3555 3.39757L17.5837 6.76894L17.5875 6.77268ZM17.5863 17.3955H17.59L28.5161 8.77432L25.5526 6.39453L17.59 12.6808H17.5863L17.5825 12.6845L9.61993 6.40201L6.66016 8.78181L17.5825 17.3992L17.5863 17.3955ZM17.5828 23.2891L17.5865 23.2854L32.2133 11.7456L35.1768 14.1254L28.5238 19.3752L17.5865 28L0.284376 14.3574L0 14.1291L2.95977 11.7531L17.5828 23.2891Z" fill="#1E80FF"/></svg></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-0cb08791 data-v-58dbfc9a><span class="container" data-v-58dbfc9a><span class="top" data-v-58dbfc9a></span><span class="middle" data-v-58dbfc9a></span><span class="bottom" data-v-58dbfc9a></span></span></button></div></div></div></div><div class="divider" data-v-0cb08791><div class="divider-line" data-v-0cb08791></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-f671d7ba data-v-05c15f47><div class="container" data-v-05c15f47><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-05c15f47><span class="vpi-align-left menu-icon" data-v-05c15f47></span><span class="menu-text" data-v-05c15f47>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-05c15f47 data-v-61eb460f><button data-v-61eb460f>Return to top</button><!----></div></div></div><aside class="VPSidebar" data-v-f671d7ba data-v-7e25b47d><div class="curtain" data-v-7e25b47d></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-7e25b47d><span class="visually-hidden" id="sidebar-aria-label" data-v-7e25b47d> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="group" data-v-7e25b47d><section class="VPSidebarItem level-0" data-v-7e25b47d data-v-f0fc17b5><div class="item" role="button" tabindex="0" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><h2 class="text" data-v-f0fc17b5>我的项目</h2><!----></div><div class="items" data-v-f0fc17b5><!--[--><div class="VPSidebarItem level-1 is-link" data-v-f0fc17b5 data-v-f0fc17b5><div class="item" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><a class="VPLink link link" href="/project/ClipboardManager/" data-v-f0fc17b5><!--[--><p class="text" data-v-f0fc17b5>超级剪贴板</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f0fc17b5 data-v-f0fc17b5><div class="item" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><a class="VPLink link link" href="/project/Markdown/" data-v-f0fc17b5><!--[--><p class="text" data-v-f0fc17b5>超级Markdown</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f0fc17b5 data-v-f0fc17b5><div class="item" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><a class="VPLink link link" href="/project/JSRunner/" data-v-f0fc17b5><!--[--><p class="text" data-v-f0fc17b5>超级JavaScript</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f0fc17b5 data-v-f0fc17b5><div class="item" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><a class="VPLink link link" href="/project/SmartWordBreak/" data-v-f0fc17b5><!--[--><p class="text" data-v-f0fc17b5>超级分词</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-7e25b47d><section class="VPSidebarItem level-0 collapsible collapsed" data-v-7e25b47d data-v-f0fc17b5><div class="item" role="button" tabindex="0" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><h2 class="text" data-v-f0fc17b5>开源作品</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-f0fc17b5><span class="vpi-chevron-right caret-icon" data-v-f0fc17b5></span></div></div><div class="items" data-v-f0fc17b5><!--[--><div class="VPSidebarItem level-1 is-link" data-v-f0fc17b5 data-v-f0fc17b5><div class="item" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><a class="VPLink link link" href="/works/opensource.html" data-v-f0fc17b5><!--[--><p class="text" data-v-f0fc17b5>个人作品</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f0fc17b5 data-v-f0fc17b5><div class="item" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><a class="VPLink link link" href="/works/contribution.html" data-v-f0fc17b5><!--[--><p class="text" data-v-f0fc17b5>社区贡献</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-7e25b47d><section class="VPSidebarItem level-0 collapsible has-active" data-v-7e25b47d data-v-f0fc17b5><div class="item" role="button" tabindex="0" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><h2 class="text" data-v-f0fc17b5>文章归档</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-f0fc17b5><span class="vpi-chevron-right caret-icon" data-v-f0fc17b5></span></div></div><div class="items" data-v-f0fc17b5><!--[--><div class="VPSidebarItem level-1 is-link" data-v-f0fc17b5 data-v-f0fc17b5><div class="item" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><a class="VPLink link link" href="/article/%E3%80%902023%E3%80%91%E9%9D%92%E8%AE%AD%E8%90%A5%20-%20%E5%89%8D%E7%AB%AF%E7%BB%83%E4%B9%A0%E9%A2%98%E6%B1%87%E6%80%BB%E8%A7%A3%E6%9E%90.html" data-v-f0fc17b5><!--[--><p class="text" data-v-f0fc17b5>【2023】青训营 - 前端练习题汇总解析</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f0fc17b5 data-v-f0fc17b5><div class="item" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><a class="VPLink link link" href="/article/%E3%80%90%E5%AD%97%E8%8A%82%E8%B7%B3%E5%8A%A8%E3%80%91%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95%E9%A2%98%E6%80%BB%E7%BB%93.html" data-v-f0fc17b5><!--[--><p class="text" data-v-f0fc17b5>【字节跳动】前端面试题总结</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f0fc17b5 data-v-f0fc17b5><div class="item" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><a class="VPLink link link" href="/article/%E3%80%90%E5%BF%AB%E6%89%8B%E3%80%91%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95%E9%A2%98.html" data-v-f0fc17b5><!--[--><p class="text" data-v-f0fc17b5>【快手】深入理解前端面试题</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f0fc17b5 data-v-f0fc17b5><div class="item" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><a class="VPLink link link" href="/article/%E3%80%90%E7%94%A8%E5%8F%8B%E9%87%91%E8%9E%8D%E3%80%91%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95%E9%A2%98%E6%80%BB%E7%BB%93.html" data-v-f0fc17b5><!--[--><p class="text" data-v-f0fc17b5>【用友金融】前端面试题总结</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f0fc17b5 data-v-f0fc17b5><div class="item" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><a class="VPLink link link" href="/article/%E4%B8%80%E6%96%87%E8%AF%BB%E6%87%82%E4%BA%8B%E4%BB%B6%E5%86%92%E6%B3%A1%E4%B8%8E%E4%BA%8B%E4%BB%B6%E6%8D%95%E8%8E%B7.html" data-v-f0fc17b5><!--[--><p class="text" data-v-f0fc17b5>一文读懂事件冒泡与事件捕获</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f0fc17b5 data-v-f0fc17b5><div class="item" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><a class="VPLink link link" href="/article/%E4%B8%80%E6%96%87%E8%AF%BB%E6%87%82%E4%BC%AA%E7%B1%BB%E4%B8%8E%E4%BC%AA%E5%85%83%E7%B4%A0.html" data-v-f0fc17b5><!--[--><p class="text" data-v-f0fc17b5>一文读懂伪类与伪元素</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f0fc17b5 data-v-f0fc17b5><div class="item" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><a class="VPLink link link" href="/article/%E4%B8%80%E6%96%87%E8%AF%BB%E6%87%82%E5%87%BD%E6%95%B0%E4%B8%ADthis%E6%8C%87%E5%90%91%E9%97%AE%E9%A2%98.html" data-v-f0fc17b5><!--[--><p class="text" data-v-f0fc17b5>一文读懂函数中this指向问题</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f0fc17b5 data-v-f0fc17b5><div class="item" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><a class="VPLink link link" href="/article/%E4%BB%8E0%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AA%E5%B9%B4%E5%BA%A6%E6%8A%A5%E5%91%8A.html" data-v-f0fc17b5><!--[--><p class="text" data-v-f0fc17b5>从0实现一个年度报告</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f0fc17b5 data-v-f0fc17b5><div class="item" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><a class="VPLink link link" href="/article/%E5%BD%BB%E5%BA%95%E6%90%9E%E6%87%82%E5%AF%B9%E8%B1%A1%E7%9A%84%E6%95%B0%E6%8D%AE%E5%B1%9E%E6%80%A7%E6%8F%8F%E8%BF%B0%E7%AC%A6%E3%80%81%E5%AD%98%E5%82%A8%E5%B1%9E%E6%80%A7%E6%8F%8F%E8%BF%B0%E7%AC%A6.html" data-v-f0fc17b5><!--[--><p class="text" data-v-f0fc17b5>彻底搞懂对象的数据属性描述符、存储属性描述符</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f0fc17b5 data-v-f0fc17b5><div class="item" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><a class="VPLink link link" href="/article/%E6%B5%85%E6%9E%90defineProperty%E4%B8%8EProxy%E5%AE%9E%E7%8E%B0%E7%9A%84%E5%8F%8C%E5%90%91%E7%BB%91%E5%AE%9A.html" data-v-f0fc17b5><!--[--><p class="text" data-v-f0fc17b5>浅析defineProperty与Proxy实现的双向绑定</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f0fc17b5 data-v-f0fc17b5><div class="item" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><a class="VPLink link link" href="/article/%E6%B7%B1%E5%85%A5JavaScript%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B.html" data-v-f0fc17b5><!--[--><p class="text" data-v-f0fc17b5>深入JavaScript数据类型</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f0fc17b5 data-v-f0fc17b5><div class="item" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><a class="VPLink link link" href="/article/%E6%B7%B1%E5%85%A5Vue3%E6%BA%90%E7%A0%81%EF%BC%8C%E7%9C%8B%E7%9C%8BVue.use%E5%90%8E%E7%A9%B6%E7%AB%9F%E5%8F%91%E7%94%9F%E4%BA%86%E4%BB%80%E4%B9%88%EF%BC%9F.html" data-v-f0fc17b5><!--[--><p class="text" data-v-f0fc17b5>深入Vue3源码,看看Vue.use后究竟发生了什么?</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f0fc17b5 data-v-f0fc17b5><div class="item" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><a class="VPLink link link" href="/article/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3Proxy%E4%B8%8EReflect.html" data-v-f0fc17b5><!--[--><p class="text" data-v-f0fc17b5>深入理解Proxy与Reflect</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f0fc17b5 data-v-f0fc17b5><div class="item" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><a class="VPLink link link" href="/article/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E6%B5%8F%E8%A7%88%E5%99%A8%E7%BC%93%E5%AD%98%E6%9C%BA%E5%88%B6.html" data-v-f0fc17b5><!--[--><p class="text" data-v-f0fc17b5>深入理解浏览器缓存机制</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f0fc17b5 data-v-f0fc17b5><div class="item" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><a class="VPLink link link" href="/article/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E6%B5%8F%E8%A7%88%E5%99%A8%E8%BF%90%E8%A1%8C%E5%8E%9F%E7%90%86.html" data-v-f0fc17b5><!--[--><p class="text" data-v-f0fc17b5>深入理解浏览器运行原理</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-7e25b47d><section class="VPSidebarItem level-0 collapsible collapsed" data-v-7e25b47d data-v-f0fc17b5><div class="item" role="button" tabindex="0" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><h2 class="text" data-v-f0fc17b5>学习笔记</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-f0fc17b5><span class="vpi-chevron-right caret-icon" data-v-f0fc17b5></span></div></div><div class="items" data-v-f0fc17b5><!--[--><div class="VPSidebarItem level-1 is-link" data-v-f0fc17b5 data-v-f0fc17b5><div class="item" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><a class="VPLink link link" href="/note/JavaScript.html" data-v-f0fc17b5><!--[--><p class="text" data-v-f0fc17b5>JavaScript基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f0fc17b5 data-v-f0fc17b5><div class="item" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><a class="VPLink link link" href="/note/CSS.html" data-v-f0fc17b5><!--[--><p class="text" data-v-f0fc17b5>CSS基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f0fc17b5 data-v-f0fc17b5><div class="item" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><a class="VPLink link link" href="/note/JavaScriptEnhanced.html" data-v-f0fc17b5><!--[--><p class="text" data-v-f0fc17b5>JavaScript进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f0fc17b5 data-v-f0fc17b5><div class="item" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><a class="VPLink link link" href="/note/Front-end%20Engineering.html" data-v-f0fc17b5><!--[--><p class="text" data-v-f0fc17b5>前端工程化</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f0fc17b5 data-v-f0fc17b5><div class="item" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><a class="VPLink link link" href="/note/SSR.html" data-v-f0fc17b5><!--[--><p class="text" data-v-f0fc17b5>服务端渲染</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f0fc17b5 data-v-f0fc17b5><div class="item" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><a class="VPLink link link" href="/note/React.html" data-v-f0fc17b5><!--[--><p class="text" data-v-f0fc17b5>React基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f0fc17b5 data-v-f0fc17b5><div class="item" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><a class="VPLink link link" href="/note/React%20Hooks.html" data-v-f0fc17b5><!--[--><p class="text" data-v-f0fc17b5>React Hooks</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f0fc17b5 data-v-f0fc17b5><div class="item" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><a class="VPLink link link" href="/note/Redux.html" data-v-f0fc17b5><!--[--><p class="text" data-v-f0fc17b5>Redux</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f0fc17b5 data-v-f0fc17b5><div class="item" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><a class="VPLink link link" href="/note/React%20Router.html" data-v-f0fc17b5><!--[--><p class="text" data-v-f0fc17b5>React Router</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f0fc17b5 data-v-f0fc17b5><div class="item" data-v-f0fc17b5><div class="indicator" data-v-f0fc17b5></div><a class="VPLink link link" href="/note/MySQL.html" data-v-f0fc17b5><!--[--><p class="text" data-v-f0fc17b5>MySQL</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-f671d7ba data-v-47a44795><div class="VPDoc has-sidebar has-aside" data-v-47a44795 data-v-e584b61a><!--[--><!--]--><div class="container" data-v-e584b61a><div class="aside" data-v-e584b61a><div class="aside-curtain" data-v-e584b61a></div><div class="aside-container" data-v-e584b61a><div class="aside-content" data-v-e584b61a><div class="VPDocAside" data-v-e584b61a data-v-f65316ad><!--[--><!--]--><!--[--><!--]--><div class="VPDocAsideOutline" role="navigation" data-v-f65316ad data-v-c9c7be2d><div class="content" data-v-c9c7be2d><div class="outline-marker" data-v-c9c7be2d></div><div class="outline-title" role="heading" aria-level="2" data-v-c9c7be2d>On this page</div><nav aria-labelledby="doc-outline-aria-label" data-v-c9c7be2d><span class="visually-hidden" id="doc-outline-aria-label" data-v-c9c7be2d> Table of Contents for current page </span><ul class="VPDocOutlineItem root" data-v-c9c7be2d data-v-ec8a1b48><!--[--><!--]--></ul></nav></div></div><!--[--><!--]--><div class="spacer" data-v-f65316ad></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-e584b61a><div class="content-container" data-v-e584b61a><!--[--><!--]--><main class="main" data-v-e584b61a><div style="position:relative;" class="vp-doc _article_%E4%B8%80%E6%96%87%E8%AF%BB%E6%87%82%E5%87%BD%E6%95%B0%E4%B8%ADthis%E6%8C%87%E5%90%91%E9%97%AE%E9%A2%98" data-v-e584b61a><div><h1 id="一文读懂函数中this指向问题" tabindex="-1">一文读懂函数中this指向问题 <a class="header-anchor" href="#一文读懂函数中this指向问题" aria-label="Permalink to "一文读懂函数中this指向问题""></a></h1><h2 id="函数中this指向" tabindex="-1">函数中this指向 <a class="header-anchor" href="#函数中this指向" aria-label="Permalink to "函数中this指向""></a></h2><p>函数在调用时, Javascript会默认为this绑定一个值</p><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>// 定义一个函数</span></span>
|
||
<span class="line"><span>function foo() {</span></span>
|
||
<span class="line"><span> console.log(this)</span></span>
|
||
<span class="line"><span>}</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span>// 1. 直接调用</span></span>
|
||
<span class="line"><span>foo() // Window</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span>// 2. 绑定对象调用</span></span>
|
||
<span class="line"><span>const obj = { name: 'ziu', aaa: foo }</span></span>
|
||
<span class="line"><span>obj.aaa() // obj</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span>// 3. 通过call/apply调用</span></span>
|
||
<span class="line"><span>foo.call('Ziu') // String {'Ziu'}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br></div></div><p>this的绑定:</p><ul><li>和定义的位置没有关系</li><li>和调用方式/调用位置有关系</li><li>是在运行时被绑定的</li></ul><p><strong>this始终指向最后调用它的对象</strong></p><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>function foo() {</span></span>
|
||
<span class="line"><span> console.log(this)</span></span>
|
||
<span class="line"><span>}</span></span>
|
||
<span class="line"><span>foo() // Window</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span>const obj = {</span></span>
|
||
<span class="line"><span> name: 'ziu',</span></span>
|
||
<span class="line"><span> bar: function () {</span></span>
|
||
<span class="line"><span> console.log(this)</span></span>
|
||
<span class="line"><span> }</span></span>
|
||
<span class="line"><span>}</span></span>
|
||
<span class="line"><span>obj.bar() // obj</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span>const baz = obj.bar</span></span>
|
||
<span class="line"><span>baz() // Window</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br></div></div><h2 id="如何改变this的指向" tabindex="-1">如何改变this的指向 <a class="header-anchor" href="#如何改变this的指向" aria-label="Permalink to "如何改变this的指向""></a></h2><h3 id="new-实例化一个函数" tabindex="-1">new 实例化一个函数 <a class="header-anchor" href="#new-实例化一个函数" aria-label="Permalink to "new 实例化一个函数""></a></h3><blockquote><p>new一个对象时发生了什么:</p><ol start="0"><li>创建一个空对象</li><li>这个空对象会被执行prototype连接</li><li>将this指向这个空对象</li><li>执行函数体中的代码</li><li>没有显式返回这个对象时 会默认返回这个对象</li></ol></blockquote><p>函数可以作为一个构造函数, 作为一个类, 可以通过new关键字将其实例化</p><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>function foo() {</span></span>
|
||
<span class="line"><span> console.log(this)</span></span>
|
||
<span class="line"><span> this.name = 'Ziu'</span></span>
|
||
<span class="line"><span>}</span></span>
|
||
<span class="line"><span>foo() // 直接调用的话 this为Window</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span>new foo() // 通过new关键字调用 则this指向空对象</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br></div></div><h3 id="使用-call-apply-bind" tabindex="-1">使用 call apply bind <a class="header-anchor" href="#使用-call-apply-bind" aria-label="Permalink to "使用 call apply bind""></a></h3><p>在 JavaScript 中, 函数是对象。</p><p>JavaScript 函数有它的属性和方法。call() 和 apply() 是预定义的函数方法。</p><p>两个方法可用于调用函数,两个方法的第一个参数必须是对象本身</p><hr><p>要将<code>foo</code>函数中的<code>this</code>指向<code>obj</code>,可以通过赋值的方式:</p><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>obj.foo = foo // 绑定</span></span>
|
||
<span class="line"><span>obj.foo() // 调用</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><p>但是也可以通过对函数调用call / apply实现</p><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>var obj = {</span></span>
|
||
<span class="line"><span> name: 'Ziu'</span></span>
|
||
<span class="line"><span>}</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span>function foo() {</span></span>
|
||
<span class="line"><span> console.log(this)</span></span>
|
||
<span class="line"><span>}</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span>foo.call(obj) // 将foo执行时的this显式绑定到了obj上 并调用foo</span></span>
|
||
<span class="line"><span>foo.call(123) // foo的this被绑定到了 Number { 123 } 上</span></span>
|
||
<span class="line"><span>foo.call("ziu") // 绑定到了 String { "ziu" } 上</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br></div></div><h4 id="包装类对象" tabindex="-1">包装类对象 <a class="header-anchor" href="#包装类对象" aria-label="Permalink to "包装类对象""></a></h4><p>当我们直接使用类似:</p><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>"ZiuChen".length // String.length</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p>的语句时,<code>JS</code>会为字符串 <code>ZiuChen</code> 包装一个对象,随后在这个对象上调用 <code>.length</code> 属性</p><h4 id="call和apply的区别" tabindex="-1">call和apply的区别 <a class="header-anchor" href="#call和apply的区别" aria-label="Permalink to "call和apply的区别""></a></h4><ul><li><p>相同点:第一个参数都是相同的,要求传入一个对象</p><ul><li>在函数调用时,会将this绑定到这个传入的对象上</li></ul></li><li><p>不同点:后面的参数</p><ul><li>apply 传入的是一个数组</li><li>call 传入的是参数列表</li></ul></li></ul><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>function foo(name, age, height) {</span></span>
|
||
<span class="line"><span> console.log(this)</span></span>
|
||
<span class="line"><span>}</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span>foo('Ziu', 18, 1.88)</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span>foo.apply('targetThis', 'Ziu', 18, 1.88)</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span>foo.call('targetThis', ['Ziu', 18, 1.88])</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br></div></div><p>当我们需要给一个带参数的函数通过call/apply的方式绑定this时,就需要使用到call/apply的第二个入参了。</p><h4 id="参数列表" tabindex="-1">参数列表 <a class="header-anchor" href="#参数列表" aria-label="Permalink to "参数列表""></a></h4><p>当传入函数的参数有多个时,可以通过<code>...args</code>将参数合并到一个数组中去</p><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>function foo(...args) {</span></span>
|
||
<span class="line"><span> console.log(args)</span></span>
|
||
<span class="line"><span>}</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span>foo("Ziu", 18, 1.88) // ["Ziu", 18, 1.88]</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><h4 id="bind绑定" tabindex="-1">bind绑定 <a class="header-anchor" href="#bind绑定" aria-label="Permalink to "bind绑定""></a></h4><p>如果我们希望:在每次调用<code>foo</code>时,都能将<code>obj</code>绑定到<code>foo</code>的<code>this</code>上,那么就需要用到<code>bind</code></p><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>// 将obj绑定到foo上</span></span>
|
||
<span class="line"><span>const fun = foo.bind(obj)</span></span>
|
||
<span class="line"><span>// 在后续每次调用foo时, foo内的this都将指向obj</span></span>
|
||
<span class="line"><span>fun() // obj</span></span>
|
||
<span class="line"><span>fun() // obj</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><p><code>bind()</code>方法将创建一个新的函数,当被调用时,将其<code>this</code>关键字</p><h2 id="箭头函数" tabindex="-1">箭头函数 <a class="header-anchor" href="#箭头函数" aria-label="Permalink to "箭头函数""></a></h2><p>箭头函数是<code>ES6</code>新增的编写函数的方式,更简洁。</p><ul><li>箭头函数不会绑定<code>this</code>、<code>argument</code>属性</li><li>箭头函数不能作为构造函数来使用(不能与<code>new</code>同用,会报错)</li></ul><h3 id="箭头函数中的this" tabindex="-1">箭头函数中的this <a class="header-anchor" href="#箭头函数中的this" aria-label="Permalink to "箭头函数中的this""></a></h3><p>在箭头函数中是没有<code>this</code>的:</p><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>const foo = () => {</span></span>
|
||
<span class="line"><span> console.log(this)</span></span>
|
||
<span class="line"><span>}</span></span>
|
||
<span class="line"><span>foo() // window</span></span>
|
||
<span class="line"><span>console.log(this) // window</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><p>之所以找到了<code>Window</code>对象,是因为在调用<code>foo()</code>时,函数内部作用域并没有找到<code>this</code>,转而向上层作用域找<code>this</code></p><p>因此找到了顶层的全局<code>this</code>,也即<code>Window</code>对象</p><h3 id="箭头函数中this的查找规则" tabindex="-1">箭头函数中this的查找规则 <a class="header-anchor" href="#箭头函数中this的查找规则" aria-label="Permalink to "箭头函数中this的查找规则""></a></h3><p>检查以下代码:</p><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>const obj = {</span></span>
|
||
<span class="line"><span> name: "obj",</span></span>
|
||
<span class="line"><span> foo: function () {</span></span>
|
||
<span class="line"><span> const bar = () => {</span></span>
|
||
<span class="line"><span> console.log(this)</span></span>
|
||
<span class="line"><span> }</span></span>
|
||
<span class="line"><span> return bar</span></span>
|
||
<span class="line"><span> }</span></span>
|
||
<span class="line"><span>}</span></span>
|
||
<span class="line"><span>const fn = obj.foo()</span></span>
|
||
<span class="line"><span>fn() // obj</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br></div></div><p>代码执行完毕,控制台输出<code>this</code>值为<code>obj</code>对象,这是为什么?</p><p>箭头函数中没有<code>this</code>,故会向上层作用域寻找<code>this</code>,<code>bar</code>的上层作用域为函数<code>foo</code>,而函数<code>foo</code>的<code>this</code>由其调用决定</p><p>调用<code>foo</code>函数的为<code>obj</code>对象,故内部箭头函数中的<code>this</code>指向的是<code>obj</code></p><p>检查以下代码:</p><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>const obj = {</span></span>
|
||
<span class="line"><span> name: "obj",</span></span>
|
||
<span class="line"><span> foo: () => {</span></span>
|
||
<span class="line"><span> const bar = () => {</span></span>
|
||
<span class="line"><span> console.log(this)</span></span>
|
||
<span class="line"><span> }</span></span>
|
||
<span class="line"><span> return bar</span></span>
|
||
<span class="line"><span> }</span></span>
|
||
<span class="line"><span>}</span></span>
|
||
<span class="line"><span>const fn = obj.foo()</span></span>
|
||
<span class="line"><span>fn() // Window</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br></div></div><p>和上面的代码不同之处在于:<code>foo</code>也是由箭头函数定义的,<code>bar</code>向上找不到<code>foo</code>的<code>this</code>,故而继续向上,找到了全局<code>this</code>,也即<code>Window</code>对象</p><h3 id="严格模式" tabindex="-1">严格模式 <a class="header-anchor" href="#严格模式" aria-label="Permalink to "严格模式""></a></h3><ul><li>在严格模式下,全局的<code>this</code>不是<code>Window</code>对象,而是<code>undefined</code>。</li><li>在 JavaScript 严格模式(strict mode)下, 在调用函数时第一个参数会成为 this 的值, 即使该参数不是一个对象。</li><li>在 JavaScript 非严格模式(non-strict mode)下, 如果第一个参数的值是 null 或 undefined, 它将使用全局对象替代。</li></ul><h2 id="this面试题" tabindex="-1">this面试题 <a class="header-anchor" href="#this面试题" aria-label="Permalink to "this面试题""></a></h2><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>var name = 'window'</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span>var person = {</span></span>
|
||
<span class="line"><span> name: 'person',</span></span>
|
||
<span class="line"><span> sayName: function () {</span></span>
|
||
<span class="line"><span> console.log(this.name)</span></span>
|
||
<span class="line"><span> }</span></span>
|
||
<span class="line"><span>}</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span>function sayName() {</span></span>
|
||
<span class="line"><span> var sss = person.sayName</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span> sss() // 默认绑定: window</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span> person.sayName(); // 隐式绑定: person</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span> (person.sayName)() // 隐式绑定: person, 本质与上一行代码相同</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span> ;(person.sayName = person.sayName)() // 间接调用: window</span></span>
|
||
<span class="line"><span>}</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span>sayName()</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br></div></div><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>var name = 'window'</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span>var person1 = {</span></span>
|
||
<span class="line"><span> name: 'person1',</span></span>
|
||
<span class="line"><span> foo1: function () {</span></span>
|
||
<span class="line"><span> console.log(this.name)</span></span>
|
||
<span class="line"><span> },</span></span>
|
||
<span class="line"><span> foo2: () => console.log(this.name),</span></span>
|
||
<span class="line"><span> foo3: function () {</span></span>
|
||
<span class="line"><span> return function () {</span></span>
|
||
<span class="line"><span> console.log(this.name)</span></span>
|
||
<span class="line"><span> }</span></span>
|
||
<span class="line"><span> },</span></span>
|
||
<span class="line"><span> foo4: function () {</span></span>
|
||
<span class="line"><span> return () => console.log(this.name)</span></span>
|
||
<span class="line"><span> }</span></span>
|
||
<span class="line"><span>}</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span>var person2 = {</span></span>
|
||
<span class="line"><span> name: 'person2'</span></span>
|
||
<span class="line"><span>}</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span>person1.foo1() // 隐式绑定: person1</span></span>
|
||
<span class="line"><span>person1.foo1.call(person2) // 显式绑定: person2</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span>person1.foo2() // 上层作用域: window</span></span>
|
||
<span class="line"><span>person1.foo2.call(person2) // 上层作用域: window</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span>person1.foo3()() // 默认绑定: window</span></span>
|
||
<span class="line"><span>person1.foo3.call(person2)() // 默认绑定: window</span></span>
|
||
<span class="line"><span>person1.foo3().call(person2) // 显式绑定: person2</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span>person1.foo4()() // 隐式绑定: person1</span></span>
|
||
<span class="line"><span>person1.foo4.call(person2)() // 显式绑定: person2</span></span>
|
||
<span class="line"><span>person1.foo4().call(person2) // 隐式绑定: person1</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br></div></div></div></div></main><footer class="VPDocFooter" data-v-e584b61a data-v-80ae8fba><!--[--><!--]--><div class="edit-info" data-v-80ae8fba><div class="edit-link" data-v-80ae8fba><a class="VPLink link vp-external-link-icon no-icon edit-link-button" href="https://github.com/ZiuChen/ZiuChen.github.io/edit/main/docs/article/一文读懂函数中this指向问题.md" target="_blank" rel="noreferrer" data-v-80ae8fba><!--[--><span class="vpi-square-pen edit-link-icon" data-v-80ae8fba></span> Edit this page on GitHub<!--]--></a></div><div class="last-updated" data-v-80ae8fba><p class="VPLastUpdated" data-v-80ae8fba data-v-7aa60d90>Updated Date: <time datetime="2024-04-02T06:24:17.000Z" data-v-7aa60d90></time></p></div></div><nav class="prev-next" data-v-80ae8fba><div class="pager" data-v-80ae8fba><a class="VPLink link pager-link prev" href="/article/%E4%B8%80%E6%96%87%E8%AF%BB%E6%87%82%E4%BC%AA%E7%B1%BB%E4%B8%8E%E4%BC%AA%E5%85%83%E7%B4%A0.html" data-v-80ae8fba><!--[--><span class="desc" data-v-80ae8fba>Previous page</span><span class="title" data-v-80ae8fba>一文读懂伪类与伪元素</span><!--]--></a></div><div class="pager" data-v-80ae8fba><a class="VPLink link pager-link next" href="/article/%E4%BB%8E0%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AA%E5%B9%B4%E5%BA%A6%E6%8A%A5%E5%91%8A.html" data-v-80ae8fba><!--[--><span class="desc" data-v-80ae8fba>Next page</span><span class="title" data-v-80ae8fba>从0实现一个年度报告</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><footer class="VPFooter has-sidebar" data-v-f671d7ba data-v-1b1e2c98><div class="container" data-v-1b1e2c98><p class="message" data-v-1b1e2c98>Released under the MIT License.</p><p class="copyright" data-v-1b1e2c98>Copyright © 2022-PRESENT ZiuChen</p></div></footer><!--[--><!--]--></div></div>
|
||
<script>window.__VP_HASH_MAP__=JSON.parse("{\"article_彻底搞懂对象的数据属性描述符、存储属性描述符.md\":\"ByA5J9P1\",\"article_浅析defineproperty与proxy实现的双向绑定.md\":\"BrUGQF3r\",\"demos_promiseify-post-message_index.md\":\"BG7lelUz\",\"demos_promiseify-post-message_inner.md\":\"BdjopwlC\",\"article_深入javascript数据类型.md\":\"DCeSGSAH\",\"article_一文读懂事件冒泡与事件捕获.md\":\"TjLbcIqK\",\"article_一文读懂伪类与伪元素.md\":\"Bbmfalr6\",\"article_一文读懂函数中this指向问题.md\":\"CIya3m9M\",\"index.md\":\"BJeM9SqU\",\"article_深入理解浏览器运行原理.md\":\"Bd53MSWi\",\"article_深入vue3源码,看看vue.use后究竟发生了什么?.md\":\"CBxMmThT\",\"article_深入理解proxy与reflect.md\":\"DzySECs3\",\"article_深入理解浏览器缓存机制.md\":\"QsEl88U7\",\"article_从0实现一个年度报告.md\":\"CxDEIrk8\",\"note_javascript.md\":\"DVtq0BtR\",\"article_【快手】深入理解前端面试题.md\":\"ClnH-us6\",\"article_【2023】青训营 - 前端练习题汇总解析.md\":\"CbjRlVYL\",\"article_【用友金融】前端面试题总结.md\":\"C0-ipX_B\",\"project_clipboardmanager_guide_index.md\":\"Bq2J2pZM\",\"note_ssr.md\":\"DSwKkvWq\",\"note_mysql.md\":\"BmpV7KM0\",\"project_jsrunner_log_index.md\":\"DcTswGCP\",\"note_react hooks.md\":\"Lvx35pOU\",\"project_clipboardmanager_log_index.md\":\"DZ7g3hrB\",\"project_clipboardmanager_statement_index.md\":\"3L8OzcsN\",\"project_markdown_log_index.md\":\"BiB5vwsm\",\"works_contribution.md\":\"CnqUajEq\",\"project_smartwordbreak_statement_index.md\":\"BNJdEKhX\",\"project_clipboardmanager_index.md\":\"B3wCMj13\",\"project_smartwordbreak_index.md\":\"0o47w9yZ\",\"project_smartwordbreak_log_index.md\":\"H607INbw\",\"note_front-end engineering.md\":\"Q-sI6y15\",\"article_【字节跳动】前端面试题总结.md\":\"DgyfNtZ_\",\"project_jsrunner_index.md\":\"Dc5oXGfY\",\"note_react router.md\":\"CLkCQF3N\",\"works_opensource.md\":\"DHkF2xOe\",\"project_markdown_shortcut_index.md\":\"C_HPTjZ3\",\"self_index.md\":\"DFRaVuat\",\"note_css.md\":\"DlV09oeZ\",\"note_redux.md\":\"D5luItQa\",\"project_markdown_index.md\":\"BxvG4_fE\",\"note_react.md\":\"DCe1arse\",\"note_javascriptenhanced.md\":\"Bh60Yw9E\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"ZiuChen\",\"description\":\"Unlimited Progress.\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"logo\":\"/logo.png\",\"nav\":[{\"text\":\"首页\",\"link\":\"/\"},{\"text\":\"我的项目\",\"items\":[{\"text\":\"超级剪贴板\",\"link\":\"/project/ClipboardManager/\"},{\"text\":\"超级Markdown\",\"link\":\"/project/Markdown/\"},{\"text\":\"超级JavaScript\",\"link\":\"/project/JSRunner/\"},{\"text\":\"超级分词\",\"link\":\"/project/SmartWordBreak/\"}]},{\"text\":\"开源作品\",\"items\":[{\"text\":\"个人作品\",\"link\":\"/works/opensource\"},{\"text\":\"社区贡献\",\"link\":\"/works/contribution\"}]},{\"text\":\"学习笔记\",\"items\":[{\"text\":\"JavaScript基础\",\"link\":\"/note/JavaScript\"},{\"text\":\"CSS基础\",\"link\":\"/note/CSS\"},{\"text\":\"JavaScript进阶\",\"link\":\"/note/JavaScriptEnhanced\"},{\"text\":\"前端工程化\",\"link\":\"/note/Front-end Engineering\"},{\"text\":\"服务端渲染\",\"link\":\"/note/SSR\"},{\"text\":\"React基础\",\"link\":\"/note/React\"},{\"text\":\"React Hooks\",\"link\":\"/note/React Hooks\"},{\"text\":\"Redux\",\"link\":\"/note/Redux\"},{\"text\":\"React Router\",\"link\":\"/note/React Router\"},{\"text\":\"MySQL\",\"link\":\"/note/MySQL\"}]},{\"text\":\"个人介绍\",\"link\":\"/self/\"}],\"sidebar\":[{\"text\":\"我的项目\",\"items\":[{\"text\":\"超级剪贴板\",\"link\":\"/project/ClipboardManager/\"},{\"text\":\"超级Markdown\",\"link\":\"/project/Markdown/\"},{\"text\":\"超级JavaScript\",\"link\":\"/project/JSRunner/\"},{\"text\":\"超级分词\",\"link\":\"/project/SmartWordBreak/\"}]},{\"text\":\"开源作品\",\"collapsed\":true,\"items\":[{\"text\":\"个人作品\",\"link\":\"/works/opensource\"},{\"text\":\"社区贡献\",\"link\":\"/works/contribution\"}]},{\"text\":\"文章归档\",\"collapsed\":true,\"items\":[{\"text\":\"【2023】青训营 - 前端练习题汇总解析\",\"link\":\"/article/【2023】青训营 - 前端练习题汇总解析.md\"},{\"text\":\"【字节跳动】前端面试题总结\",\"link\":\"/article/【字节跳动】前端面试题总结.md\"},{\"text\":\"【快手】深入理解前端面试题\",\"link\":\"/article/【快手】深入理解前端面试题.md\"},{\"text\":\"【用友金融】前端面试题总结\",\"link\":\"/article/【用友金融】前端面试题总结.md\"},{\"text\":\"一文读懂事件冒泡与事件捕获\",\"link\":\"/article/一文读懂事件冒泡与事件捕获.md\"},{\"text\":\"一文读懂伪类与伪元素\",\"link\":\"/article/一文读懂伪类与伪元素.md\"},{\"text\":\"一文读懂函数中this指向问题\",\"link\":\"/article/一文读懂函数中this指向问题.md\"},{\"text\":\"从0实现一个年度报告\",\"link\":\"/article/从0实现一个年度报告.md\"},{\"text\":\"彻底搞懂对象的数据属性描述符、存储属性描述符\",\"link\":\"/article/彻底搞懂对象的数据属性描述符、存储属性描述符.md\"},{\"text\":\"浅析defineProperty与Proxy实现的双向绑定\",\"link\":\"/article/浅析defineProperty与Proxy实现的双向绑定.md\"},{\"text\":\"深入JavaScript数据类型\",\"link\":\"/article/深入JavaScript数据类型.md\"},{\"text\":\"深入Vue3源码,看看Vue.use后究竟发生了什么?\",\"link\":\"/article/深入Vue3源码,看看Vue.use后究竟发生了什么?.md\"},{\"text\":\"深入理解Proxy与Reflect\",\"link\":\"/article/深入理解Proxy与Reflect.md\"},{\"text\":\"深入理解浏览器缓存机制\",\"link\":\"/article/深入理解浏览器缓存机制.md\"},{\"text\":\"深入理解浏览器运行原理\",\"link\":\"/article/深入理解浏览器运行原理.md\"}]},{\"text\":\"学习笔记\",\"collapsed\":true,\"items\":[{\"text\":\"JavaScript基础\",\"link\":\"/note/JavaScript\"},{\"text\":\"CSS基础\",\"link\":\"/note/CSS\"},{\"text\":\"JavaScript进阶\",\"link\":\"/note/JavaScriptEnhanced\"},{\"text\":\"前端工程化\",\"link\":\"/note/Front-end Engineering\"},{\"text\":\"服务端渲染\",\"link\":\"/note/SSR\"},{\"text\":\"React基础\",\"link\":\"/note/React\"},{\"text\":\"React Hooks\",\"link\":\"/note/React Hooks\"},{\"text\":\"Redux\",\"link\":\"/note/Redux\"},{\"text\":\"React Router\",\"link\":\"/note/React Router\"},{\"text\":\"MySQL\",\"link\":\"/note/MySQL\"}]}],\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/ZiuChen\"},{\"icon\":{\"svg\":\"<svg width=\\\"36\\\" height=\\\"28\\\" viewBox=\\\"0 0 36 28\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path fill-rule=\\\"evenodd\\\" clip-rule=\\\"evenodd\\\" d=\\\"M17.5875 6.77268L21.8232 3.40505L17.5875 0.00748237L17.5837 0L13.3555 3.39757L17.5837 6.76894L17.5875 6.77268ZM17.5863 17.3955H17.59L28.5161 8.77432L25.5526 6.39453L17.59 12.6808H17.5863L17.5825 12.6845L9.61993 6.40201L6.66016 8.78181L17.5825 17.3992L17.5863 17.3955ZM17.5828 23.2891L17.5865 23.2854L32.2133 11.7456L35.1768 14.1254L28.5238 19.3752L17.5865 28L0.284376 14.3574L0 14.1291L2.95977 11.7531L17.5828 23.2891Z\\\" fill=\\\"#1E80FF\\\"/></svg>\"},\"link\":\"https://juejin.cn/user/1887205216238477\"}],\"editLink\":{\"pattern\":\"https://github.com/ZiuChen/ZiuChen.github.io/edit/main/docs/:path\",\"text\":\"Edit this page on GitHub\"},\"footer\":{\"message\":\"Released under the MIT License.\",\"copyright\":\"Copyright © 2022-PRESENT ZiuChen\"},\"lastUpdatedText\":\"Updated Date\",\"search\":{\"provider\":\"algolia\",\"options\":{\"appId\":\"LFZ2CPWWUG\",\"apiKey\":\"b4fd296ea5e467b3ac4a582160ff3122\",\"indexName\":\"ziuchenio\"}}},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
|
||
|
||
</body>
|
||
</html> |