JS知识点汇总(六)--作用域链this

news2025/1/12 15:52:36

1. 什么是作用域链?

作用域,即变量(变量作用域又称上下文)和函数生效(能被访问)的区域或集合
换句话说,作用域决定了代码区块中变量和其他资源的可见性

1. 作用域分类

一般将作用域分成:

  • 全局作用域
  • 函数作用域
  • 块级作用域

全局作用域
任何不在函数中或是大括号中声明的变量,都是在全局作用域下,全局作用域下声明的变量可以在程序的任意位置访问

// 全局变量
var func= 'Hello World!';
function fun() {
  console.log(func);
}
// 打印 'Hello World!'
fun();

函数作用域
函数作用域也叫局部作用域,如果一个变量是在函数内部声明的它就在一个函数作用域下面。这些变量只能在函数内部访问,不能在函数以外去访问

function greet() {
  var greeting = 'Hello World!';
  console.log(greeting);
}
// 打印 'Hello World!'
greet();
// 报错: Uncaught ReferenceError: greeting is not defined
console.log(greeting);

在函数内部声明的变量或函数,在函数外部是无法访问的,这说明在函数内部定义的变量或者方法只是函数作用域
块级作用域
ES6引入了let和const关键字,和var关键字不同,在大括号中使用let和const声明的变量存在于块级作用域中。在大括号之外不能访问这些变量

{
  // 块级作用域中的变量
  let greeting = 'Hello World!';
  var lang = 'English';
  console.log(greeting); // Prints 'Hello World!'
}
// 变量 'English'
console.log(lang);
// 报错:Uncaught ReferenceError: greeting is not defined
console.log(greeting);

2.词法作用域

词法作用域,又叫静态作用域,变量被创建时就确定好了,而非执行阶段确定的。也就是说我们写好代码时它的作用域就确定了,JavaScript 遵循的就是词法作用域

var a = 1;
function foo(){
    console.log(a)
}
function bar(){
    var a = 2;
    foo();
}
bar()
由于js遵循词法作用域,相同层级的 foo 和 bar 就没有办法访问到彼此块作用域中的变量,所以输出1

3. 作用域链

当在Javascript中使用一个变量的时候,首先Javascript引擎会尝试在当前作用域下去寻找该变量,如果没找到,再到它的上层作用域寻找,以此类推直到找到该变量或是已经到了全局作用域

如果在全局作用域里仍然找不到该变量,它就会在全局范围内隐式声明该变量(非严格模式下)或是直接报错

用《你不知道的Javascript(上)》中的一张图解释:

把作用域比喻成一个建筑,这份建筑代表程序中的嵌套作用域链,第一层代表当前的执行作用域,顶层代表全局作用域 变量的引用会顺着当前楼层进行查找,如果找不到,则会往上一层找,一旦到达顶层,查找的过程都会停止
在这里插入图片描述

var x = 10;
function foo() {
    var y = 15;
    function bar() {
        var z = 20;
        console.log(x + y + z);
    };
    bar()
};
foo();
此时作用域链有三级,第一级为bar AO,第二级为foo AO,然后Global Object(VO)
scope -> bar.AO -> foo.AO -> Global Object

2. this是什么?绑定规则是什么?优先级是怎样的?

1.this的定义

this 关键字是函数运行时自动生成的一个内部对象,只能在函数内部使用,总指向调用它的对象
同时,this在函数执行过程中,this一旦被确定了,就不可以再更改
在绝大多数情况下,函数的调用方式决定了 this 的值(运行时绑定)

2.绑定规则

根据不同的使用场合,this有不同的值,主要分为下面几种情况:

  • 默认绑定
  • 隐式绑定
  • new绑定
  • 显示绑定

默认绑定
全局环境中定义person函数,内部使用this关键字


var name = 'Jenny';
function person() {
    return this.name;
}
console.log(person());  //Jenny

注:严格模式下,不能将全局对象用于默认绑定,this会绑定到undefined,只有函数运行在非严格模式下,默认绑定才能绑定到全局对象

隐式绑定
函数还可以作为某个对象的方法调用,这时this就指这个上级对象


function test() {
  console.log(this.x);
}

var obj = {};
obj.x = 1;
obj.m = test;

obj.m(); // 1

new绑定
通过构建函数new关键字生成一个实例对象,此时this指向这个实例对象


function test() {
 this.x = 1;
}

var obj = new test();
obj.x // 1

之所以能过输出1,是因为new关键字改变了this的指向

new过程遇到return一个对象,此时this指向为返回的对象


function fn()  
{  
    this.user = 'xxx';  
    return {};  
}
var a = new fn();  
console.log(a.user); //undefined

显示修改
apply()、call()、bind()是函数的一个方法,作用是改变函数的调用对象。它的第一个参数就表示改变后的调用这个函数的对象。因此,这时this指的就是这第一个参数

var x = 0;
function test() {
 console.log(this.x);
}

var obj = {};
obj.x = 1;
obj.m = test;
obj.m.apply(obj) // 1

3.优先级

new绑定优先级 > 显示绑定优先级 > 隐式绑定优先级 > 默认绑定优先级

隐式绑定 VS 显式绑定

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

var obj1 = {
    x: 1,
    foo: foo
};

var obj2 = {
    x: 3,
    foo: foo
};

obj1.foo(); // 1
obj2.foo(); // 3

obj1.foo.call( obj2 ); // 3
obj2.foo.call( obj1 ); // 1

new绑定 VS 隐式绑定

function foo(o) {
    this.x = o;
}
var obj1 = {
    foo: foo
};
var obj2 = {};
obj1.foo( 2 );
console.log( obj1.x ); // 2

obj1.foo.call( obj2, 3 );
console.log( obj2.x ); // 3

var bar = new obj1.foo( 4 );
console.log( obj1.x ); // 2
console.log( bar.x ); // 4

new绑定的优先级>隐式绑定

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/703841.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TDengine 发布 IoT 场景下 3.0 性能对比分析报告,全方位超越 InfluxDB TimescaleDB

6 月 26 日,涛思数据旗下时序数据库(Time Series Database) TDengine 正式发布 IoT 场景下 TDengine 3.0 性能对比分析报告,该报告在 IoT 场景下从数据写入、压缩和查询等维度,对比了 TDengine 与市场其他流行的时序数…

Linux系统安装QQ最新版

腾讯在2023-05-30更新了linux版的qq,这次界面终于不再复古,好看多了。 安装步骤: 1.进入官网,寻找合适的安装包下载 https://im.qq.com/linuxqq/index.shtml 选择跟自己计算机匹配的版本,一般都是X86,如…

VMware共享文件夹

当虚拟机需要使用宿主机里的文件时,就需要在虚拟机设置里添加共享文件夹,大概过程如下: 虚拟机设置: 在centos里,完成上述操作后会生成一个目录 /mnt/hgfs 宿主机里的文件就在这个目录里可以看到并使用了。

编译linux内核(二)

编译linux内核 1. 准备工作1.1 下载内核文件1.2 环境准备1.3 内核命名规则 2. 编译内核2.1 升级gcc2.2 make menuconfig其他报错2.3 配置选项2.4 编译内核2.5 安装模块2.6 安装内核2.7 验证内核 3. 制作内核文件3.1 创建磁盘文件3.2 磁盘分区3.3 将磁盘分区关联到/dev/loop7设备…

化学理论知识vr沉浸式教学软件推动立足“学生老师双主体”一体化的教学模式改革

VR虚拟仿真是基于虚拟现实、3D技术、计算机技术等搭建起来的一套具有数字化、智慧化的智能教学系统,它以学生学习为中心,探索学科内容,使用VR虚拟现实将学科内容以3D立体化形式呈现,培养学生的思维创新、实操技能。 VR虚拟仿真技术…

【数据库基础】Mysql基本概念讲解与实操

文章目录 数据库基础服务器,数据库,表关系Mysql的架构Sql分类 库的操作修改默认的编码格式两种校验修改数据库删除数据库备份和恢复观察用户,查看连接 表的操作修改表字段长度删除某一列修改表名修改列名称 数据类型小数类型floatdecimal字符…

Hystrix

一、Hystrix(豪猪)简介 1、Hystrix的设计目的 (1)对依赖服务调用时出现的调用延迟和调用失败进行控制和容错保护。 (2)阻止某一个依赖服务的故障在整个系统中蔓延,服务A->服务B->服务C,服务C故障了…

MySQL - Delete 和 Truncate 的区别

1. DELETE 命令 语法 : delete from 表名 [where 条件] -- 删除数据 (避免这样写, 会全部删除) DELETE FROM student;-- 删除指定数据 DELETE FROM student WHERE id 1; 2. TRUNCATE 命令 作用 : 完全清空一个数据库表, 表的结构和索引约束不会变. -- 清空 stu…

大体积mbtiles影像地图文件用什么软件浏览?

mbtiles格式简称mbt,是一种影像地图文件。PC端和手机端都有软件可以加载留着mbt格式的影像地图。 电脑桌面端 电脑端上的软件可以使用“图新地球”,直接把mbt文件拖到地图上即可,非常简便。 手机端 可以从华为应用商店下载“外业精灵”app…

Meta提出用向量检索来改进图像描述模型

出品人:Towhee 技术团队 作者:王翔宇 顾梦佳 随着深度神经网络的发展,自动图像描述技术取得了令人瞩目的进展。然而,现有的方法主要注重生成的描述与人类参考描述之间的相似性,却忽视了描述在实际应用中的特定目标。Me…

用户体验测试要怎么做?

用户体验测试是软件和应用程序开发的关键环节,它可以帮助团队了解如何优化产品以提高用户满意度,那用户体验测试要怎么做?下面是一些进行用户体验测试的最佳实践: 制定测试计划 在进行用户体验测试之前,您需要制定测试…

【Gradio】Could not create share link

Gradio是MIT的开源项目,用于构建机器学习和数据科学演示和 Web 应用,挺有意思的,感兴趣的同学可以去Gradio官网查看。 本地环境: - OS: Win 11 - Pyton: 3.10.11 - Gradio: 3.29.0 Gradio库的安装(Python 需要3.7 版本): - pip …

6.5 指令与文件的搜寻

6.5.1 指令文件名的搜寻 在终端机模式当中,连续输入两次[tab]按键就能够知道使用者有多少指令可以下达。 which (寻找“可执行文件”) 这个指令是根据“PATH”这个环境变量所规范的路径,去搜寻“可执行文件”的文件名。所以&…

iOS distribution发布证书过期或者被手动revoke了app会被下架吗?

在距离distribution 证书过期一个月(或被手动revoke了)的时候会受到apple的邮件 虽然distribution过期(或者被手动revoke)了,如果你的开发者账号是company(公司)类型或个人类型的,只…

LDR6023Q在USB摄像头转接器的应用

最近USB摄像头火了起来,连接手机后可以用于直播,内窥镜,探鱼器,上网课等等,应用非常广泛,但在长时间连接手机的时候,电量消耗特别快,所以USB摄像头转接器应运而生。 USB摄像头转接器…

多元回归预测 | Matlab海鸥算法(SOA)优化极限学习机ELM回归预测,SOA-ELM回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab海鸥算法(SOA)优化极限学习机ELM回归预测,SOA-ELM回归预测,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %% 清空环…

我的创作纪念日(一周年)

机缘 作为一位互联网安全专业的大一学生,我始终怀抱着提升自身技术能力、保护网络安全、推动互联网世界发展的初心。 通过实战项目的经验分享,我收获颇多。参与团队网络安全演练与攻防对抗,使我学会了应对不同类型攻击与漏洞,提…

vue(typescript)项目在vs中打开出现的各种问题

目录 vue3 报错解决:找不到模块或其相应的类型声明。(Vue 3 can not find module) (TS) 未知的编译器选项“allowImportingTsExtensions”。 TS6046 (TS) “--moduleResolution”选项的参数必须为 node, classic, node16, nodenext。…

FinalShell连接不上Ubantu

解决方法 1.ssh服务问题 1.先安装openssh-server服务 sudo apt install aopenssh-server 2.重启ssh服务 sudo systemctl restart ssh 2.防火墙问题 1. 直接关闭防火墙(最省时) ufw stop 2. 开放FinalShell要连接的端口号,下图。 ufw allow 22

python使用WxPusher自动向微信发送信息

Github地址:https://github.com/wxpusher/wxpusher-docs Demo演示功能:https://wxpusher.zjiecode.com/demo/ 使用说明文档:https://wxpusher.zjiecode.com/docs/#/ 使用方法 首先进入网址:https://wxpusher.zjiecode.com/admi…