有关js的变量作用域和this指针的讨论

标题:有关JS的变量作用域和this指针的讨论

1. 变量作用域

1.1 作用域是什么

在JS中,作用域可以理解为变量的有效范围。JS支持两种作用域:全局作用域和函数作用域。

全局作用域是指整个JS文件,其内定义的变量可以被文件中任何一个函数所使用。

函数作用域是指只在函数体内部(包括函数体内嵌套的函数中)定义的变量。这些变量只在函数体内及其内部的函数中有效。

1.2 变量声明提前

在JS中,变量可以在使用前先声明。这是因为JS中存在变量声明提前的机制,即JS在运行时会将函数中声明的变量提前至函数的顶部。

示例代码:

function test(){
  console.log(a); // undefined
  var a = 10;
  console.log(a); // 10
}
test();

1.3 块级作用域

在ES6中,引入了块级作用域。块级作用域是指if、for、while等语句的{}内(即花括号内)定义的变量,在语句外部无法访问,但在语句内部可以。

示例代码:

var a = 10;

if(true){
  var a = 20;
  let b = 30;
}
console.log(a); // 20
console.log(b); // Uncaught ReferenceError: b is not defined

2. this指针

2.1 this是什么

在JS中,this指针用于引用当前正在执行的函数所属的对象。this指针的实际指向是在函数被调用时确定的。

2.2 函数调用方式对this的影响

函数的调用方式有以下几种:

  1. 作为普通函数调用

当函数作为普通函数来调用时,this指向全局对象。在浏览器环境下,全局对象就是window对象;在Node.js环境下,全局对象就是global对象。

javascript
function test(){
console.log(this);
}
test(); // window

  1. 作为对象方法调用

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

javascript
var obj = {
name: 'Tom',
sayName: function(){
console.log(this.name);
}
};
obj.sayName(); // "Tom"

  1. 作为构造函数调用

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

javascript
function Person(name){
this.name = name;
}
var p = new Person('Tom');
console.log(p.name); // "Tom"

  1. 使用apply、call或bind方法调用

当使用apply、call或bind方法来调用函数时,this指向调用该方法时传入的第一个参数。

javascript
var obj1 = {
name: 'Tom'
};
var obj2 = {
name: 'Jerry'
};
function test(){
console.log(this.name);
}
test.apply(obj1); // "Tom"
test.call(obj2); // "Jerry"
var f = test.bind(obj1);
f(); // "Tom"

2.3 箭头函数中的this

在箭头函数中,this指向的是包含箭头函数的函数的this指针,而不是箭头函数自己的this指针。

示例代码:

var obj = {
  name: 'Tom',
  sayName: function(){
    var func = ()=>console.log(this.name);
    func();
  }
};
obj.sayName(); // "Tom"

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:有关js的变量作用域和this指针的讨论 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 基于javascript实现漂亮的页面过渡动画效果附源码下载

    下面详细讲解一下“基于javascript实现漂亮的页面过渡动画效果附源码下载”的完整攻略。 一、前言 随着互联网的发展,用户对于网站的要求也越来越高,而页面过渡动画效果可以很好的提高用户体验,增强网站的吸引力。在这篇攻略中,我们将会介绍如何基于Javascript实现漂亮的页面过渡动画效果。 二、概述 本攻略将会通过两个实例来说明如何利用Javascrip…

    JavaScript 2023年6月10日
    00
  • js获取判断上传文件后缀名的示例代码

    当需要上传文件时,有时我们需要判断文件的后缀名是否符合规范,例如只支持上传jpg、png、gif等图片格式。这时我们可以通过 JavaScript 来获取并判断上传文件的后缀名是否符合要求。下面是获取判断上传文件后缀名的示例代码的完整攻略: 1. 获取上传的文件信息 在 HTML 中,我们需要使用 <input> 标签的 type 属性为 “fi…

    JavaScript 2023年5月27日
    00
  • 详解微信小程序动画Animation执行过程

    详解微信小程序动画Animation执行过程 微信小程序是一种轻量化的应用程序,常用于展示性质较强的场景,并且它内置了易用且功能强大的动画组件Animation,下面我们就来详解一下这个组件的执行过程。 Animation的基本结构 在使用Animation时,我们需要先创建一个Animation实例,其结构如下: var animation = wx.cr…

    JavaScript 2023年6月10日
    00
  • 使用JavaScript实现按钮的涟漪效果实例代码

    让我为您详细讲解使用JavaScript实现按钮涟漪效果的攻略。 标题 在开始之前,我们需要了解这个效果的实现原理。当用户点击一个按钮时,会在按钮的中心产生一个白色圆形的涟漪效果,随着时间的推移,这个圆形会逐渐消失。 为了实现这个效果,我们需要在按钮被点击的时候在按钮中心产生一个白色圆形,并且不断对这个圆形进行缩小和透明度降低的处理,直到圆形消失。 那么,如…

    JavaScript 2023年6月11日
    00
  • JS装饰者模式和TypeScript装饰器

    JS装饰者模式 JS装饰者模式是一种基于对象组合的设计模式,它允许你向对象添加新的行为,而不必修改原始代码。这种模式常常被应用在对象功能的增强上,比如在不改变原有代码的情况下,增加对象新的特性或行为,从而达到代码的可重用性和可扩展性。 装饰器模式的核心思想是“装饰”,即在不改变原对象的基础上,通过装饰器对象对其进行增强或改变。通常,装饰器对象会通过接受一个原…

    JavaScript 2023年6月10日
    00
  • js每隔两秒输出数组中的一项(实例)

    下面是讲解“js每隔两秒输出数组中的一项”的完整攻略,具体步骤如下: 1. 准备工作 在开始实现之前,我们需要明确几个问题: 哪个数组需要输出? 如何输出数组中的一项? 如何达到每隔两秒输出一项的效果? 针对以上问题,我们可以做如下解答: 这里假设我们要输出的数组是一个长度为n的一维数组 输出数组中的一项可以使用数组索引,即array[index]的形式来实…

    JavaScript 2023年5月27日
    00
  • Jquery中$.post和$.ajax的用法小结

    下面我将详细讲解“Jquery中$.post和$.ajax的用法小结”的完整攻略。 什么是 $.post 和 $.ajax $.post 和 $.ajax 都是 jQuery 提供的用于发送 AJAX 请求的方法。 $.post 是 jQuery 中一个进行 post 请求的方法 $.ajax 是 jQuery 提供的最底层的 AJAX 请求方法,它可以接收…

    JavaScript 2023年5月19日
    00
  • 分享11个常用JavaScript小技巧

    分享11个常用JavaScript小技巧 在这篇文章中,我们将分享11个常用的JavaScript小技巧,这些技巧能够帮助你更好的理解JavaScript的各种特性和功能。下面是这11个小技巧的详细说明: 技巧1: 使用let和const关键字 使用let和const关键字可以声明变量和常量,相比使用var声明的变量,let和const关键字具备了更好的作用…

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