JS-this指向
普通函数
this
的值取决于函数是如何被调用的
<body> <script> // 函数普通中 this指向window function foo() { console.log(this) } foo() // this的指向是在函数调用时确定的 // 函数是由对象调用的, 函数中的this指向调用它的对象 // 对于全局函数是由window对象调用的 // window.foo() </script> </body>
构造函数
构造函数中的this
指向实例对象
<body> <script> function Person() { // 构造函数中this指向创建的实例对象 } var p = new Person() </script> </body>
对象的方法
对象的方法中的this
指向对象
<body> <script> const obj = { sayHi() { console.log(this) }, } obj.sayHi() </script> </body>
事件回调
事件回调中的this
指向触发事件的对象
<body> <div>1111</div> <script> const div = document.querySelector('div') div.addEventListener('click', function () { // 事件的回调用, 由对应dom对象调用的 console.log(this) }) </script> </body>
定时器
定时器中的this
指向window
<body> <script> // 定时器的回调是由window对象调用的, 因此, 回调中的this指向window对象 window.setTimeout(function () { console.log(this) }, 1000) </script> </body>
箭头函数
箭头函数的this
值是在函数定义时确定的,而不是在函数调用时。箭头函数会捕获其父级作用域的this
值,无论这个this
值如何变化,箭头函数中的this
都会保持不变。
判断方法: 找this的父级作用域, 函数作用域
或全局作用域
<body> <script> const fn = () => { console.log(this) } fn() const obj = { name: 'xiaoming', } // call()调用函数, 同时改变this的指向 function foo() { // 在foo作用域中, this指向obj的 console.log(this) const bar = () => { console.log(this) } bar() } foo.call(obj) </script> </body>
function Person() { this.age = 0; // 普通函数 setInterval(function growUp() { // 这里的this指向window或undefined(取决于是否在严格模式下) this.age++; console.log(this.age); // 这里的this不会按预期指向Person实例 }, 1000); // 箭头函数 setInterval(() => { // 这里的this捕获的是Person实例的this this.age++; console.log(this.age); // 这里的this会按预期指向Person实例 }, 1000); } var p = new Person();
应用
<body> <button>点击</button> <script> document.querySelector('button').addEventListener('click', function () { // 在事件回调中, this指向button的dom对象 console.log(this) setTimeout(() => { // 在定时的普通回调中, this指向window // 在定时的箭头回调中, this指向外部(定义时)的this, 也就是dom this.innerHTML = '点击了' }, 1000) }) // 在回调函数定义时, 尽量使用箭头函数 </script> </body>
本文作者:Khru
本文链接:https://www.cnblogs.com/khrushchefox/p/18573261
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步