前端面试——关于this指向问题?

想要知道关于this的指向问题,首先要了解this的绑定规则。那么this到底是什么样的绑定规则呢?一起来研究一下吧!

绑定一:默认绑定

绑定二:饮食绑定

绑定三:显示绑定

绑定四:隐式绑定

1. 默认绑定

什么情况下使用默认绑定呢?独立函数调用。独立的函数调用我们可以理解成函数没有绑定到某个对象上调用:

首先在非严格模式 下,this指向全局对象。在严格模式下,函数内的this指向undefined,全局中的this指向不会改变。

1.1 严格模式下的默认绑定

举个栗子:

javascript 复制代码
"use strict";
 
// var 定义的变量 a 挂载到 window 对象上
var a = 10;
 
function foo () {
  // 严格模式下,函数内 this 指向 undefind
  console.log('this1 --- ', this) // undefined
 
  // 报错,Uncaught TypeError: Cannot read properties of undefined (reading 'a')
  console.log(this.a) 
 
  console.log(window.a) // 10
}
 
// 严格模式 不会改变全局中 this 的指向
console.log('this2', this) // window
 
foo();

1.2 let、const、var 变量的默认绑定

let、const声明的全局变量,不会绑定到window上

var声明的全局变量,会被绑定到window上

javascript 复制代码
let a = 10
const b = 20
 
function foo () {
  console.log(this.a) // undefined
  console.log(this.b) // undefined
}
 
foo();
 
console.log(window.a) // undefined  

1.3 函数作用域中的this指向

关键点:

  • 要判断函数是谁调用的,进而确定this绑定的作用域是哪儿个
  • 要确定好打印的函数内部的变量。还是this上的变量(打印a、打印t h is .a不一样**)**
javascript 复制代码
// window 中的 a
var a = 1;
 
function foo () {
  // 函数中的 a
  var a = 2
 
  console.log(this) // Window{...}
 
  // 打印的是 this.a,不是 a,因此是 window 下的 a(是 window 调用的 foo 函数)
  console.log(this.a) // 1
}
 
foo()

再举个例子:

javascript 复制代码
var a = 1
 
function foo () {
 
  var a = 2
 
  function inner () {
    // inner 内没有 a,因此往上面的 foo 的函数作用域找
    // foo 内有 a,但是 foo 是 window 调用的,foo 内的 this 就是 window
    // 打印的是 this a,不是 a,因此要判断正确的 this,也就是 window
    // 最终输出 1
    console.log(this.a)
  }
 
  inner()
}
 
foo()

2. 隐式绑定

当函数引用有上下文对象时,如obj.foo()的调用方式,foo()

。。。。。还没写完

相关推荐
fish_xk2 小时前
c++中的引用和数组
开发语言·c++
酒尘&5 小时前
JS数组不止Array!索引集合类全面解析
开发语言·前端·javascript·学习·js
冬夜戏雪5 小时前
【java学习日记】【2025.12.7】【7/60】
java·开发语言·学习
xwill*5 小时前
分词器(Tokenizer)-sentencepiece(把训练语料中的字符自动组合成一个最优的子词(subword)集合。)
开发语言·pytorch·python
学历真的很重要5 小时前
VsCode+Roo Code+Gemini 2.5 Pro+Gemini Balance AI辅助编程环境搭建(理论上通过多个Api Key负载均衡达到无限免费Gemini 2.5 Pro)
前端·人工智能·vscode·后端·语言模型·负载均衡·ai编程
咖啡の猫6 小时前
Python列表的查询操作
开发语言·python
quikai19816 小时前
python练习第三组
开发语言·python
用户47949283569156 小时前
"讲讲原型链" —— 面试官最爱问的 JavaScript 基础
前端·javascript·面试
用户47949283569156 小时前
2025 年 TC39 都在忙什么?Import Bytes、Iterator Chunking 来了
前端·javascript·面试
JIngJaneIL7 小时前
基于Java非遗传承文化管理系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot