JS难点之:this怎么用

为什么要有this?

我们来看两串代码

这一串没有this辅助

js 复制代码
const user1={name:'张三'}
function sayName1(){
console.log(user1.name)
}
const user2={name:'李四'}
function sayName2(){
console.log(user2.name)
}
sayName1()//张三
sayName2()//李四

这一串有this辅助

js 复制代码
function sayName(){
console.log(this.name)
}
const user1={name:'张三'}
const user2={name:'李四'}
sayName.call(user1)//张三
sayName.call(user2)//李四

明明两串代码差不多长,为什么偏偏选择要用this呢

因为this是js当中的一个关键字,提供了一种更优雅的方式隐式地传递一个对象的引用,可以让代码更高效更简洁,易于复用

this能被用在哪?

有域的地方就有this,用在不同的地方,代指的东西不一样

  1. 全局

this出现在全局时 this===window

当this在node中被使用时,输出的是一个空对象

js 复制代码
console.log(this)//{}

当this被浏览器调用时

  1. 函数体内

this的绑定规则

  1. 默认绑定:当函数独立调用时,函数中的this指向window对象
js 复制代码
var a=1    //===window:{a:1}
function foo() {
    console.log(this.a)
}

function bar(){
    var a=2
    foo()
}
bar()//浏览器输出1,node输出undefined

当代码执行时,由于foo里面没有定义a,所以foo就会去window找a,所以输出1

  1. 隐式绑定:当一个函数被一个上下文对象所拥有,并被该对象调用,函数中的this指向该对象
js 复制代码
function foo(){
    console.log(this)
}
var obj={
    a:1,
   foo:foo
}
 obj.foo()//{a:1,foo:f}

此时foo被obj调用,所以this指向obj,输出{a:1,foo:f}

  1. 隐式丢失:当一个函数被多层对象调用,函数的this指向最近的那个对象
js 复制代码
function foo() {
    console.log(this.a)
}

var obj = {
    a: 1,
    foo: foo
}

var oo = {
    a: 2,
    foo: obj
}

oo.foo.foo()//1,相当于执行obj.foo(),所以this指向的是obj
  1. 显示绑定:
  • fn.call(obj,x,y)
js 复制代码
function foo(x,y){
    console.log(this.a,x+y)
}
var obj={
    a:1
}
foo.call(obj,1,2,3)//1  3  将obj中的参数传入foo中执行,其余从前往后执行
foo//undefined NaN
  • fn.apply(obj,x,y) ,xy是数组的最后两位
js 复制代码
function foo(a,x,y){
    console.log(this.a,x+y)
}
var obj={
    a:1
}
foo.apply(obj,[1,2,3,4])//1 7    执行数组的最后两位,分别是3、4
  • fn.bind(obj,x,y)()
js 复制代码
function foo(a,x,y){
    console.log(this.a,x+y)
}
var obj={
    a:1
}

foo.bind(obj,1,2,3,4)(1,2)//1 5 返回的值是2,3,是从第二个参数开始执行的
foo.bind(obj,1)(1)//1 2  参数可以分开传递

小拓展之箭头函数

箭头函数没有this的概念,写在箭头函数中的this,也是它外层那个非箭头函数的this

js 复制代码
var fn=()=>{
    console.log(this.a)
}
var obj={
    a:1,
    fn:fn
}
obj.fn()//undefined

this挂载在全局上,相当于在全局输出a,执行时与obj无关,由于全局没有定义a,所以输出undefined

不能作为构造函数用

js 复制代码
function foo(){
 var fn=()=>{
  this.a=1
 }
 fn()//相当于foo(){this.a=1}
}
 var obj={
    a:2,
    bar:foo
 }
obj.bar()
console.log(obj.a)//1
相关推荐
ShineWinsu9 小时前
对于JavaScript:操作元素的解析
开发语言·前端·javascript·面试·web·dom·元素
szp200512 小时前
Cache API 会丢掉 URL 里的 #:我的 9 个模型分块一直写在同一条缓存上
javascript·浏览器
keyipatience13 小时前
TypeScript学习(1)
前端·javascript·学习·typescript·html·css3
xifangge202513 小时前
基于 JavaScript 实现 CNC 数控切削参数与螺纹公差纯前端核算引擎
开发语言·前端·javascript
honkun614 小时前
vue 表格组件 vxe-table 修改滚动条样式,修改滚动条样式,统一宽度、颜色与自动隐藏
前端·javascript·vue.js
FRing0314 小时前
JavaScript入门到精通二十四(正则表达式、元字符、修饰符)
开发语言·前端·javascript·正则表达式
大明二代15 小时前
从 RAG 到有记忆的 Agent:Mastra Memory 与 PostgreSQL 实战
前端·javascript·人工智能
小羊没烦恼!15 小时前
C#综合揭秘——Entity Framework 并发处理详解
java·开发语言·前端·javascript·数据库·mysql·c#
OpsEye16 小时前
模型能力波动怎么办?网关侧做模型质量监控与自动切换
javascript·ai编程
西红柿炖牛腩35418 小时前
机房电脑不能联网,怎么离线把课件里的 3D 模型压小?Draco / Meshopt 参数清单
前端·javascript·3d·性能优化·大屏端