详解JavaScript的this指向和绑定

yizhihongxing

详解JavaScript的this指向和绑定

什么是this

在JavaScript中,this关键字是一个对象,它根据函数的调用方式不同而发生变化。在定义函数的时候我们通常称之为上下文,然后在执行函数的时候确定它的上下文。

this指向

this指向在JavaScript中是非常灵活的。一般情况下它指向的是调用函数的对象,但是在一些情况下它的行为会非常变态。下面我们来详细讲解JavaScript中this的指向。

全局作用域中的this

在全局作用域中使用this是非常简单的,它会指向全局对象——window(浏览器中)或者global(Node.js中)。

console.log(this); // window (浏览器环境)

函数作用域中的this

在函数作用域中使用this的指向有很多情况,分别对应不同的函数调用方式。

直接调用函数

当直接调用函数时,this会指向全局对象。

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

foo(); // window (浏览器环境)

作为对象的方法调用

当作为对象的方法调用时,this指向的是调用这个方法的对象。

let obj = {
    name: 'MonkeyKing',
    showName: function() {
        console.log(this.name);
    }
}

obj.showName(); // MonkeyKing

作为构造函数调用

当使用构造函数创建对象时,this将指向新创建的对象。

function Person(name) {
    this.name = name;
}

let p1 = new Person('Allen');
console.log(p1.name); // 'Allen'

通过call和apply调用

通过call和apply调用时,this指向的是传入的第一个参数。

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

let obj1 = { name: 'Allen' };
let obj2 = { name: 'Bob' };

foo.call(obj1); // Allen
foo.apply(obj2); // Bob

箭头函数中的this

箭头函数中的this和包含箭头函数的上一层作用域中的 this 指向是一样的。

function Person(name) {
    this.name = name;

    return () => console.log(this.name);
}

let p1 = new Person('Allen');
let p2 = new Person('Bob');

let getName1 = p1();
let getName2 = p2();

getName1(); // Allen
getName2(); // Bob

this的绑定

如果要在函数定义时就指定this的指向,可以使用bind、call和apply方法。其中bind返回一个新的函数,call和apply直接调用函数。

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

let obj1 = { name: 'Allen' };
let obj2 = { name: 'Bob' };

let bindFoo = foo.bind(obj1);
bindFoo(); // Allen

foo.call(obj2); // Bob

foo.apply(obj1); // Allen

总结

本文详细讲解了JavaScript中this的指向和绑定。this指向在JavaScript中非常灵活,可以说是很难掌握的部分。如果想要深入学习JavaScript,必须要彻底掌握this的指向和绑定。

示例1:

// 定义一个计算器对象
let calculator = {
    num1: 0,
    num2: 0,
    setNum(num1, num2) {
        this.num1 = num1;
        this.num2 = num2;
    },
    add() {
        return this.num1 + this.num2;
    },
    subtract() {
        return this.num1 - this.num2;
    }
}

// 设置计算器的两个数
calculator.setNum(2, 3);

// 进行加减运算
console.log(calculator.add()); // 5
console.log(calculator.subtract()); // -1

示例2:

let person1 = {
    name: 'Allen',
    age: 20,
    greet: function() {
        console.log('Hello ' + this.name);
    }
}

let person2 = {
    name: 'Bob',
    age: 30
}

// 在person2上调用person1的greet方法
person1.greet.call(person2); // 'Hello Bob'

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解JavaScript的this指向和绑定 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • 使用 JavaScript 进行函数式编程 (一) 翻译

    我来为您详细讲解“使用 JavaScript 进行函数式编程 (一) 翻译”的完整攻略。 标题 使用 JavaScript 进行函数式编程 (一) 翻译 简介 函数式编程(Functional Programming)是一种在编程语言中处理函数的方法。JavaScript 作为一种多范式语言,也支持函数式编程。本文将带您了解 JavaScript 中的函数式…

    JavaScript 2023年5月18日
    00
  • JS验证不重复验证码

    关于 “JS验证不重复验证码”的完整攻略,我将按以下步骤讲解。 第一步:在前端生成并展示验证码 首先,在前端页面中,我们需要生成一个验证码,可以使用不同的方式,如下面的代码示例所示: <div> <label for="captcha-input">验证码:</label> <input type…

    JavaScript 2023年6月10日
    00
  • JS原型链怎么理解

    JS原型链是JS中一个非常重要的概念,理解原型链可以帮助我们更好地理解JS中的对象,继承以及函数等相关知识。下面是JS原型链的详细讲解攻略。 什么是原型链? 在了解什么是原型链之前,我们首先要了解JS中对象的原型。 在JS中,每个对象都有一个原型对象 prototype,其包含了一组属性和方法,并且可以和其他对象形成继承关系。在访问一个对象的属性或方法时,如…

    JavaScript 2023年6月10日
    00
  • vue 获取url里参数的两种方法小结

    下面我将为您详细讲解“vue 获取url里参数的两种方法小结”的完整攻略。 一、 获取参数的两种方法 方法一:使用正则表达式 这种方法需要使用正则表达式来获取url里的参数,步骤如下: 获取当前页面的url let url = window.location.href; 编写正则表达式,获取url里的参数 假设我们要获取名为“id”的参数,正则表达式如下: …

    JavaScript 2023年6月11日
    00
  • JavaScript遍历Json串浏览器输出的结果不统一问题

    问题描述: 在JavaScript中遍历Json字符串时,不同的浏览器会输出不同的结果,导致开发者难以准确依赖其输出结果,进而对程序的正确性进行判断。 问题原因: 不同浏览器对Json字符串的处理方式存在一些细微的差异,如浏览器可能会为Json对象的属性添加双引号或单引号,不同的浏览器可能会针对Json字符串采用不同的解析方式,未能完全遵循标准的Json格式…

    JavaScript 2023年5月27日
    00
  • Javascript基础知识(二)事件

    Javascript基础知识(二)事件 一、事件的定义和使用 事件是指在操作网页时所产生的一系列动作,例如鼠标点击、键盘输入、窗口滚动等等。通过事件,我们可以给网页绑定相应的响应函数,实现网页的交互功能。 在Javascript中,事件通常被定义为对象的一种,可以使用addEventListener()方法来绑定事件函数。示例代码如下: document.g…

    JavaScript 2023年6月10日
    00
  • JS+HTML5手机开发之滚动和惯性缓动实现方法分析

    JS+HTML5手机开发之滚动和惯性缓动实现方法分析 简介 在移动端开发中,实现滚动和惯性缓动是非常常见的功能,本文将基于JS和HTML5,详细讲解实现这一功能的方法和实现过程。本文中的代码及示例在iOS和Android均测试通过。 方法分析 滚动和惯性缓动可以通过使用CSS3的transform属性进行实现,如下所示: .container { trans…

    JavaScript 2023年6月11日
    00
  • Three.js 进阶之旅:全景漫游-高阶版在线看房 ?

    声明:本文涉及图文和模型素材仅用于个人学习、研究和欣赏,请勿二次修改、非法传播、转载、出版、商用、及进行其他获利行为。 摘要 专栏上篇文章《Three.js 进阶之旅:全景漫游-初阶移动相机版》中通过创建多个球体全景场景并移动相机和控制器的方式实现了多个场景之间的穿梭漫游。这种方式的缺点也是显而易见的,随着全景场景的增加来创建对应数量的球体,使得空间关系计算…

    JavaScript 2023年4月17日
    00
合作推广
合作推广
分享本页
返回顶部