javascript中this关键字详解

2023-12-08前端开发
2

JavaScript中this关键字详解

在JavaScript中,this关键字用来引用当前函数的执行上下文。它可以用来引用当前正在执行的对象,这使得在函数内部可以访问该对象的属性和方法。

1. this的值

this的值取决于它被使用的上下文。

1.1 全局上下文

在全局上下文中,this指向全局对象。在浏览器中,这个对象就是window对象。

console.log(this === window) // true

1.2 函数上下文

在函数内部,this的值可以是多种不同的值,具体取决于函数被调用的方式。

1.2.1 函数作为普通函数调用

当函数作为普通函数调用时,this指向全局对象。

function foo() {
  console.log(this === window)
}

foo() // true

1.2.2 函数作为对象的方法调用

当函数作为对象的方法调用时,this指向该对象。

var obj = {
  foo: function() {
    console.log(this === obj)
  }
}

obj.foo() // true

1.2.3 函数作为构造函数调用

当函数作为构造函数调用时,this指向新创建的对象。

function Foo() {
  this.bar = 'baz'
}

var obj = new Foo()

console.log(obj.bar) // baz

1.2.4 函数使用apply、call或bind调用

使用applycallbind函数调用时,this可以被指定为任何一个对象。

function foo() {
  console.log(this.name)
}

var obj1 = { name: 'object 1' }
var obj2 = { name: 'object 2' }

foo.apply(obj1) // object 1
foo.call(obj2)  // object 2
foo.bind(obj1)() // object 1

1.3 箭头函数中的this

在箭头函数中,this是在创建函数时确定的,而不是在调用函数的时候确定的。它是函数作用域内部的一个不可变值。

var obj = {
  foo: () => {
    console.log(this === obj)
  }
}

obj.foo() // false

2. 使用this的常见问题

this的值通常会被认为是难以理解和预测的,这是由于其值不仅仅是由其上下文决定的,还会受到很多其他因素的影响。以下是使用this时常见的问题。

2.1 混乱的上下文

当函数执行的上下文发生变化时,this的值也会发生变化。在使用this时,我们需要非常小心,以确保它的值始终是我们所期望的值。

var obj = {
  foo: function() {
    console.log(this === obj)
  }
}

var bar = obj.foo

bar() // false

2.2 使用箭头函数时没有正确地绑定this

在使用箭头函数时,我们需要非常小心,以确保它的上下文与我们所期望的一样。由于箭头函数没有自己的上下文,所以如果在箭头函数中使用了this,它将引用其外部上下文的this。这可能会导致意外的行为。

var obj = {
  foo: () => {
    console.log(this === obj)
  }
}

obj.foo() // false

总结

this是JavaScript中一个非常重要的关键字。它确定了函数被调用时的上下文,从而使函数能够引用适当的对象。在理解了this的基本工作原理之后,我们可以更轻松地在JavaScript中编写复杂的代码。

示例1

var a = {
  value: 0,
  increment: function() {
    this.value++
    console.log(this.value)
  }
}

var b = {
  value: 0,
  increment: a.increment
}

a.increment() // 1
b.increment() // 1

a.increment中,this指向aa.value被递增并输出1。而在b.increment中,this指向b,但它仍然调用了a.increment,这意味着a.value也被递增,输出1

示例2

function Counter() {
  this.count = 0

  setInterval(function() {
    this.count++
    console.log(this.count)
  }, 1000)
}

var counter = new Counter()

在这个示例中,setInterval函数中的函数被作为普通函数使用,因此它的this指向全局对象。为了与对象实例保持一致,我们需要将this绑定到Counter函数的实例上。

function Counter() {
  this.count = 0

  setInterval(function() {
    this.count++
    console.log(this.count)
  }.bind(this), 1000)
}

var counter = new Counter()
The End

相关推荐

layui实现图片上传成功后回显点击放大图片功能
layui实现图片上传成功后回显点击放大图片功能,html代码部分: !-- html代码--div class="layui-form-item" label class="layui-form-label"上传图片/label div class="layui-input-block" button type="button" class="layui-btn" id="license-auth-letter-...
2025-09-06 前端开发
202

Layui实现数据表格中鼠标悬停图片放大离开时恢复原图
Layui实现数据表格中鼠标悬停图片放大离开时恢复原图的效果,最终效果如下图所示: 实现代码如下,在done函数中调用hoverOpenImg方法 var tableIns = window.demoTable = table .render({ elem : '#idTest', id : 'idTest', url : '/postData', //width : 150...
2025-09-04 前端开发
112

layui点击文本输入框调起弹出选择框并选择内容的两种方法参考
我们在用到layui时候,需要点击文本输入框调起弹出选择框并选择内容,这个要怎么操作呢?以下两种方法可以参考: 1、点击名称,弹出信息弹框,选择表格中的某一行,实现效果如下: html页面代码 !--计量器具弹出层-- div id="equipment" lay-filter="equipmen...
2025-09-02 前端开发
167

网站部署https后百度地图不显示问题
https的网站如果引用百度地图,会出现加载不了的问题,这是因为涉及到跨域问题,网站是https的,但是引用百度地图的是http的,这个要怎么操作呢? 比如我引用的地址:http://api.map.baidu.com/api?v=2.0ak=AK显示 后来看了一下,少了一个s=1字段,加一下s=1...
2025-07-28 前端开发
139

微信小程序实现点击复制功能和手机拨打电话功能
做小程序项目的时候,客户提了一个功能需求优化,就是长按文字需要复制全部内容,因为有的手机支持全选复制,有的手机不支持全选复制。 通过设置系统剪贴板的内容和获取系统剪贴板的内容实现复制功能 html相关代码: van-field value="{{form.contactPhone}}"...
2025-07-02 前端开发
78

js拖拽排序插件Sortable.js如何使用
由于项目功能需要,要实现对table中的行实现拖拽排序功能,找来找去发现Sortable.js能很好的满足这个需求,而且它还是开源的,于是乎就开始学习使用Sortable.js 特点 轻量级但功能强大 移动列表项时有动画 支持触屏设备和大多数浏览器(IE9及以下除外) 支持...
2025-06-12 前端开发
161