JS中this的指向

JS中this的指向

this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象。

实例#

定义函数与对象并调用,注意只有调用函数才会使this指向调用者,但箭头函数除外。

Copy
function s(){ console.log(this); } // window中直接调用 // 非 use strict s(); // Window // 等同于window.s(),调用者为window // window是Window的一个实例 // window instanceof Window //true // 新建对象s1 var s1 = { t1: function(){ // 测试this指向调用者 console.log(this); // s1 s(); // Window // 此次调用仍然相当 window.s(),调用者为window }, t2: () => { // 测试箭头函数,this并未指向调用者 console.log(this); }, t3: { // 测试对象中的对象 tt1: function() { console.log(this); } }, t4: { // 测试箭头函数以及非函数调用this并未指向调用者 tt1: () => { console.log(this); } }, t5: function(){ // 测试函数调用时箭头函数的this的指向,其指向了上一层对象的调用者 return { tt1: () => { console.log(this); } } } } s1.t1(); // s1对象 // 此处的调用者为 s1 所以打印对象为 s1 s1.t2(); // Window s1.t3.tt1(); // s1.t3对象 s1.t4.tt1(); // Window s1.t5().tt1(); // s1对象

比较特殊的例子,我们调用同一个方法,但是得到的this是不同的,要注意实际上this的最终指向的是那个调用它的对象。

Copy
var s1 = { t1: function(){ console.log(this); } } s1.t1(); // s1对象 var p = s1.t1; p(); // Window // 注意此时将方法赋值给了p,此时直接调用p得到的this是Window // 其实这个例子也并不是很特殊,因为函数也是一个对象,此时p是被赋值了一个函数 console.log(p); // ƒ (){console.log(this);} // 而此函数是被window调用的,由此,this指向了window

改变this指向#

Copy
使用 apply、call、bind可以改变this的指向,可以参考 https://github.com/WindrunnerMax/EveryDay/blob/master/JavaScript/apply%E3%80%81call%E3%80%81bind.md

每日一题#

Copy
https://github.com/WindrunnerMax/EveryDay

参考#

Copy
http://www.ruanyifeng.com/blog/2018/06/javascript-this.html
posted @   WindRunnerMax  阅读(181)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示
CONTENTS