跟我学习javascript的this关键字

当编写 JavaScript 代码时,经常会使用 this 关键字。它可以引用当前上下文中的对象,其行为特点是动态绑定。但是,该关键字在不同的上下文环境中使用可能会产生不同的结果,这常常导致初学者的困惑。本文将深入讲解 JavaScript 的 this 关键字, 帮助初学者理解并正确运用它。

1. this关键字指向全局对象

在全局环境中,使用 this 关键字会指向全局对象,即浏览器中的 window, Node.js 环境中的 global。以下是一个简单的示例:

console.log(this); //输出结果为:Window {…} 或 global {...}

在浏览器控制台中,上述代码会输出全局对象 Window。

2. this关键字指向对象

当在对象内部使用函数时, this 关键字会指向该对象。例如:

let person = {
  name: "ZhangSan",
  age: 18,
  sayHello: function() {
    console.log("Hello, I am " + this.name + ", " + this.age + " years old.");
  }
}

person.sayHello(); //输出结果为:Hello, I am ZhangSan, 18 years old.

上述代码中,this 引用了 person 对象。因此,当调用 person.sayHello() 时,this 指向该对象,输出结果为:Hello, I am ZhangSan, 18 years old.

如果在普通函数内部使用 this 关键字时, this 将指向全局对象,而非最近的对象。例如:

let person = {
  name: "ZhangSan",
  age: 18,
  sayHello: function() {
    console.log("Hello, I am " + this.name + ", " + this.age + " years old.");
  },
  sayHi: function() {
    function inner() {
      console.log("Hi, I am " + this.name); //此处的this将指向全局对象
    }
    inner();
  }
}

person.sayHi(); //输出结果为:Hi, I am undefined

上述代码中,sayHi() 函数内部使用了普通函数 inner(), 导致其中的this关键字指向了全局对象。因此,在调用 person.sayHi() 时,输出结果为:Hi, I am undefined。

为了正确地引用 this 关键字,可以使用箭头函数来代替普通函数,因为箭头函数的 this 关键字可以按照所在上下文继承上一层作用域内的 this 值,不会改变其指向。例如:

let person = {
  name: "ZhangSan",
  age: 18,
  sayHello: function() {
    console.log("Hello, I am " + this.name + ", " + this.age + " years old.");
  },
  sayHi: function() {
    let inner = () => {
      console.log("Hi, I am " + this.name); //此处的this会继承最近的person对象
    }
    inner();
  }
}

person.sayHi(); //输出结果为:Hi, I am ZhangSan

在上述代码中,已经通过箭头函数确保了inner()中的 this 关键字指向了 person 对象。因此,在调用 person.sayHi() 时,输出结果为:Hi, I am ZhangSan。

除了上述内容,还有以下内容需要注意:

  • 在构造函数中,this 关键字指向新创建的对象,即构造函数的实例对象。
  • 在使用 call() 或 apply() 方法调用函数时,可以以参数的形式传递一个上下文(即 this 绑定的对象)。
  • 在使用 bind() 方法调用函数时,也可以指定函数内 this 的值。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:跟我学习javascript的this关键字 - Python技术站

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

相关文章

  • JavaScript你不知道的一些数组方法

    下面是详细讲解“JavaScript你不知道的一些数组方法”的完整攻略。 一、前言 JavaScript 中数组是非常常用的数据结构,JS 对数组的操作也非常丰富。其中一些方法在日常的开发中比较常见,比如push、pop、shift和unshift等等,但是还有一些方法很少被知道或使用,这些方法不仅可以提高效率,还可以让代码更加优美。 本篇攻略主要介绍 Ja…

    JavaScript 2023年5月27日
    00
  • 学习JavaScript设计模式之代理模式

    学习JavaScript设计模式之代理模式 什么是代理模式 代理模式是一种结构型设计模式,可以为其他对象提供一种代理以控制对这个对象的访问。 代理模式允许在不改变原始对象行为的情况下,通过代理对象来控制或修改对象的行为。这种方式提供了一种更加灵活和安全的访问对象的方式。 代理模式由三个部分组成,分别是目标对象(即要被代理的对象)、代理对象和客户端。 代理模式…

    JavaScript 2023年6月11日
    00
  • blob转换成string格式同步调用问题解决分析

    问题描述: 在开发过程中,我们有时会需要将Blob数据类型转换为String类型。Blob对象表示不可变、原始数据的类文件对象。但是,Blob类型的数据转换为String类型时,会涉及到异步回调的执行问题,常常导致数据无法按预期输出或报错。所以,本文将会讲解 Blob转换为String格式的同步调用问题,并提供解决方案。 解决方案: 使用FileReader…

    JavaScript 2023年6月11日
    00
  • 一文带你玩转JavaScript的箭头函数

    一文带你玩转JavaScript的箭头函数 什么是箭头函数? 箭头函数是ES6引入的一种新的函数声明语法,它可以让我们更简洁地书写函数,并且可以解决一些this指向上的问题。 箭头函数与普通函数的区别在于箭头函数没有自己的this,它的this是词法作用域中的this,即在定义箭头函数时所处的上下文中的this。 箭头函数的基本语法 箭头函数有两种语法: 不…

    JavaScript 2023年5月27日
    00
  • 深入理解javascript严格模式(Strict Mode)

    深入理解JavaScript严格模式 JavaScript严格模式(Strict Mode)是ECMAScript 5引入了一种新的执行模式,主要用于消除JavaScript语言的一些不合理、不严谨之处,减少一些怪异行为。 启用严格模式 全局启用严格模式 要想在全局范围启用严格模式,需要在JavaScript源码文件的顶部添加如下代码: "use …

    JavaScript 2023年5月28日
    00
  • 如何确保JavaScript的执行顺序 之jQuery.html并非万能钥匙

    如何确保JavaScript的执行顺序 之jQuery.html并非万能钥匙 一、背景 在前端开发中,我们经常会遇到多个JS文件需要按照特定的顺序加载执行,否则会出现各种奇怪的问题。其中,使用jQuery.html方法加载外部JS文件,不同的浏览器会有不同的表现,这给我们的开发带来了一定的困扰。本文将针对这个问题,通过归纳总结,给出可靠的解决方案。 二、问题…

    JavaScript 2023年5月27日
    00
  • JavaScript正则表达式和级联效果

    JavaScript正则表达式是一种强大的文本处理工具,可以帮助我们快速查找、替换并验证字符串。级联效果是指在表单中使用多个输入框时,前后输入框的内容之间会有一定的联系和限制。下面是JavaScript正则表达式和级联效果的详细攻略。 JavaScript正则表达式 什么是正则表达式 正则表达式即为RegExp对象,通过正则表达式可以匹配字符串并且进行替换。…

    JavaScript 2023年6月10日
    00
  • JS动态加载脚本并执行回调操作

    JS动态加载脚本并执行回调操作是一种常见的前端开发技巧,可以提高网站的性能和用户体验。下面我将为大家详细讲解这个过程的完整攻略。 首先,我们需要了解两个关键技术:动态创建script标签和回调函数。通过动态创建script标签,我们可以在不刷新页面的情况下,在当前页面中加载外部的.js脚本文件。而回调函数则是在这个外部脚本加载完毕后执行的函数,可以让我们在脚…

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