JavaScript概念总结:作用域、闭包、对象与原型链

FPGA入门指南:从硬件并行到电路思维,解决效率困境 数字电路设计是计算机体系结构中的基础领域,其核心在于通过硬件描述语言构建专用电路,实现并行计算。FPGA(现场可编程门阵列)作为一种可重构硬件,通过查找表(LUT)、触发器和可编程互连资源,允许开发者自定义数字电路,从而在特定任务上实现远超通用处理器的性能。其技术价值在于为计算密集型、高并行性任务提供了灵活高效的硬件加速方案,广泛应用于图像处理、信号采集、高速接口等领域。例如,在fpga图像处理中,通过空间并行和流水线技术,可同时处理多个像素,大幅提升吞吐量;而在fpga串口通信等接口设计中,FPGA的可配 阅读详情

1 JavaScript变量作用域

1.1 函数作用域

没有块作用域:即作用域不是以{}包围的,其作用域完成由函数来决定,因而if /for等语句中的花括号不是独立的作用域。

如前述,JS的在函数中定义的局部变量只对这个函数内部可见,称之谓函数作用域。

嵌套作用域变量搜索规则:当在函数中引用一个变量时,JS会搜索当前函数作用域,如果没有找到则搜索其上层作用域,一直到全局作用域。

var  value = 'global';
var f1 = function(){
  console.log(v1);   //global
};
f1();
var f2 = function(){
  var v1 ='local';
  console.log(v1); //local
};
f2();


词法作用域规则:函数的嵌套关系是定义时决定的,而非调用时决定的,即词法作用域,即嵌套关系是由词法分析时确定的,而非运行时决定。

var v1 = 'global';
var f1 = function(){
  console.log(v1);  
}
f1();  //global
var f2 = function(){
  var v1 = 'local';
  f1();
};
f2();  //global


对于这两个规则的相互作用,函数内无论什么位置定义的局部变量,在进入函数时都是已经定义的,但未初始化,即为undefined,直到运行到变量被赋值时才被初始化,因此若访问了未初始化的变量,我们会得到undefined的说明。

var v1 = 'global';
var f = function(){
  console.log(v1);   //undefined
  var v1 =  'local';
};


1.2 全局作用域

全局作用域的变量是全局对象的属性,不论在什么函数中都可以直接访问,而不需要通过全局对象,但加上全局对象,可以提供搜索效率。

满足下列条件的变量属于全局作用域:

在最外层定义的变量

全局对象的属性

任何地方隐匿定义的变量。

2 闭包

2.1 装饰的定义

function f1(){
  //context define
  function f2(){
   //func define 
 };
  return f2;
};
f2(); //获得f1中的context


在类似C/C++这种的非函数式编程语言中,我们也可以定义函数指针并返回,但外层函数在执行结束后为内层函数定义的上下文信息会被销毁,而在闭包中,则保存了返回的函数,还包含返回函数的上下文信息。(由词法作用域所支持)而且在返回闭包之后,上下文信息即被单独创建出来,从而可以生成多个互相独立的闭包实例。

2.2 闭包的用途

闭包有两个用途,一是方便实现嵌套的回调函数,二是隐藏对象的细节。

对于前者,NodeJS的编程风格已经可以说明问题,对二后者,对于函数内部的局部变量外部是不可见的,但可以提供访问函数来访问和修改相应的局部变量,从而实现OO封装的意图。

3 对象

在基于类型的语言中,对象是由类实例化,而JS是基于原型的系统,对象是由原型复制生成的。

3.1 对象的创建与访问

JavaScript中的Object实际上就是一个由属性组成的关联数组,属性由名称和值组成。可以由new Object()或{}来创建对象。对于创建简单对象,可以使用对象初始化器来创建对象,即由{}字面值来创建对象,对象的属性名可以为加''的字符串,也可不加引号。这对JS来说没有区别,访问对象的属性时,可以使用句点也可使用关联数组['name'],后者的好处是当我们不知道对象属性名时,可以由变量来作为关联数组的索引。

3.2 构造函数

我们也可以通过自定义构造函数来生成对象,从而能实例化更多的对象。构造函数也是函数,我们需要用大写的函数名即可。在函数中可以定义成员变量,成员函数等。

3.3 上下文对象

在JS中,上下文对象即this指针,即被调用函数所处的环境。其作用是在函数内部引用到调用它的对象本身。this的出现会之前介绍的静态作用域产生影响,加入了动态的内容。


由例子可以看到,我们可以通过不同的变量引用函数,不同之处调用上下文。

传递与绑定上下文

JavaScript的函数可以通过Call和Apply来动态绑定到特定的上下文。

如果想永久的绑定上下文,可以使用bind函数,需要注意的是同一函数上的多次bind是没有效果的。

var person = {
  name:'noname',
   getName:function(){console.log(this.name); }
};

var bill = {name:'Bill'};
person.getName(); //noname
bill.getName = person.getName;
bill.getName();         //Bill
name = 'JavaScript';
func = person.getName;
func();         //JavaScript


3.4 原型

创建对象时,我们应该在构造函数内定义一般成员,而是其原型定义成员函数。

下面我们会主要介绍原型链

JS中有两个特殊的对象:Object与Function,它们都是构造函数,用于生成对象。

Object.prototype是所有对象的祖先,Function.prototype是所有函数的原型,包括构造函数。

可以将JS的对象分为三类:用户创建对象,构造函数对象,原型对象。

所有对象中都有一个__proto__属性,其指向此对象的原型。

构造函数对象有prototype,指向其原型对象,通过此构造函数创建对象时,新创建对象的__proto__属性将会指向构造函数的prototype属性。

原型对象有一个constructor属性,指向它对应的构造函数。

function Foo() {}
var obj = new Object();
var foo = new Foo();


参考文献:《Node.JS开发指南》

深信服AF设置安全防护策略 防火墙设置安全防护策略,禁止用户访问指定网站 阅读详情

相关推荐

红外图像和可见光图像异源图像配准问题研究

本文旨在研究一种具有高准确率和鲁棒性的融合图像障碍物检测技术,通过把红外和可见光图像进行图像配准和融合,获取高质量的异源融合图像,根据融合图像的特点采用有效的障碍物检测算法,将图像中的障碍物准确检出。......

G_redsky的博客 1万+

作用域链和原型链

一.原型链与作用域链 区别: 作用域是对于变量而言,原型链是对于对象的属性。 作用域链顶层是window,原型链顶层是Object。 联系:从链表开头寻找,直到找到为止。 二、作用域链 作用域 作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。作用域分为全局作用域和局部作用域 全局作用域:任何地方都能访问到的对象拥有全局作用域。 局部作用域:局部作用域一般只在固定...

CSH_lucky的博客 2272

STC8G1K08A 实战应用:从配置到功能实现

本文详细介绍了STC8G1K08A单片机的实战应用,从开发环境搭建、GPIO配置、ADC模块使用到定时器中断处理和PWM输出等核心功能。重点讲解了外设模块的协同工作配置技巧,并分享了实际项目开发中的经验教训,帮助开发者快速掌握STC8G1K08A的高效应用。

n4o5p6q7r的博客 391

作用域链、原型链

1. 作用域链作用 保证对执行环境有权访问的所有变量和函数的有序访问,通过作用域链,我们可以访问到外层环境的变量和函数。 2.作用域链概念 作用域链的本质上是一个指向变量对象的指针列表。 变量对象是一个包含了执行环境中所有变量和函数的对象。 作用域链的前端始终都是当前执行上下文的变量对象。 全局执行上下文的变量对象(也就是全局对象)始终是作用域链的最后一个对象。 当我们查找一个变量时,如果当前执行环境中没有找到,我们可以沿着作用域链向后查找。 3.原型链 当访问一个对象的属性时, 会在

weixin_47227886的博客 615

鸿蒙手机卸载内置应用 adb连接

**傻瓜式删除鸿蒙系统内置应用,自己亲测有效。**

JJDXBT的博客 3万+

Windows Server 2012评估版过期自动关机问题:两种高效解决方案详解

本文针对Windows Server 2012评估版过期导致的自动关机问题,提供了两种高效解决方案。一是通过slmgr.vbs命令重置授权,临时延长评估期;二是使用DISM工具将评估版转换为正式版,一劳永逸。文章详细解析了两种方法的操作步骤、注意事项及适用场景,帮助用户快速恢复服务器稳定运行。

pytorchlight8的博客 1195

详解作用域链、原型链、闭包

文章目录一、作用域全局作用域函数作用域块级作用域补充----动态作用域this(下一篇文章会继续介绍)二、变量的作用域全局变量局部变量全局变量和局部变量的区别三、作用域链四、变量和函数的声明提升变量的声明提升函数声明提升变量声明和函数声明提升的联系五、原型原型对象理解**函数对象的 prototype 属性****constructor 属性**对象的 __proto__ 属性原型属性六、原型链七、闭包基本含义特点应用场景`setTimeout` 传参回调IIFE(自执行函数)函数防抖、节流柯里化模块化解决

PILIpilipala的博客 1219

1.2 固态变压器:传统工频变压器的局限与SST的技术起源

本小节明确传统工频变压器在电力系统中的基础定位与核心工作特性,系统分析其在新型电力系统场景下的固有技术瓶颈,梳理固态变压器(Solid State Transformer, SST,又称电力电子变压器Power Electronic Transformer, PET)从概念提出到工程化成熟的完整演进路径,为后续SST技术优势、设计需求与规范符合性要求的讲解建立底层逻辑,同时对应GB/T 40429-2021《电力电子变压器通用技术要求》的需求制定背景。

技术工作者 658

前段面试必考之原型链与闭包

瞧一瞧,看一看;前段面试必考之原型链与闭包。very important!

weixin_55088962的博客 449

3D点云-CVPR 2020-PF-Net: Point Fractal Network for 3D Point Cloud Completion

是一种专门为三维点云补全设计的深度学习模型。点云补全实际上和图片补全是一个逻辑,都是采用GAN模型的思想来进行补全,在图片补全中,将部分像素点删除并且标记,然后卷积特征提取预测、判别器判别,来训练模型,生成的像素点与原来像素点比较完成模型的训练。而PF-Net就是采用GAN的思想在3D点云上的应用。

404 Not Found 2369

用Python实现辅助病案首页主诊断编码:从数据清洗到模型上线(上)

本文介绍了一个使用Python构建AI辅助病案首页主诊断编码系统的完整指南。文章从环境搭建开始,详细讲解了数据准备与清洗策略,包括数据格式标准化、文本清洗与脱敏处理等关键步骤。系统采用深度学习技术处理复杂的医疗文本,解决ICD编码面临的文本复杂性、专业性和数据不一致性等挑战。文中提供了完整的代码实现,涵盖数据预处理、敏感信息脱敏、文本分割等实用功能模块,帮助医疗机构构建可落地、可扩展的智能编码系统,提高编码准确性和工作效率。

AllenLV的博客 922

JavaScript中的链(作用域链、原型链)

JavaScript中的链(作用域链、原型链) Js中存在两种老生常谈的链,作用域链和原型链。作用域链是为了访问变量而存在的链,原型链是访问对象的属性而存在的链。 作用域链 说到作用域链,首先来说下作用域的概念:执行代码的上下文,也可以说是变量对象,是开始进入一个函数的执行环境的时候,形成的所有可访问变量,可以说变量对象是作用域的实体。 作用域分类:全局作用域、函数作用域(块级作用域)、eval作...

low666的博客 1618

基于Keil软件实现OLED显示(江协科技HAL库)

没有HAL库的OLED驱动文件,可以看过来

2401_82728381的博客 1452

JS三座大山-同步异步-作用域、闭包-原型、原型链

JS三座大山 同步异步 前端中只有两个操作是异步的: 定时器异步执行; ajax异步请求 编译器解析+执行代码原理: 编译器从上往下逐一解析代码 判断代码是同步还是异步 同步:立即执行 异步:不执行。放入事件队列池 等所有同步执行完毕开始执行异步 同步异步区别 api : 异步有回调,同步没有回调 性能 : 异步性能好(不阻塞线程) 同步会阻塞线程 顺序 : 同步有序执行,异步无序执行 另: 回调函数:如果一个函数的参数是一个函数,那么这个参数函数叫做回调函数 作用域、闭包

weixin_46873254的博客 633

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

JavaScript 的三座大山

js 作为前端的中坚力量。那么 javascript 三座大山,你知道是哪些呢?

xxxzzzqqq_的博客 545

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

js三座大山

#1、原型与原型链, #2、作用域及闭包, #3、异步和单线程, 原型与原型链 说到原型,就不得不提一下构造函数,首先我们看下面一个简单的例子: function Dog(name,age){ this.name = name; this.age = age; } let dog1 = new Dog("哈士奇",3); let dog2 = new Dog("泰迪",2);...

flykus的博客 2195

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【JS函数】JS函数之普通、构造、闭包函数

一、普通函数关于函数基础内容建议查看w3school:JavaScript 函数二、构造函数1.定义:构造函数就是初始化一个实例对象,对象的prototype属性是继承一个实例对象2.主要内容:a.默认函数首字母大写b.构造函数并没有显示返回任何东西。new 操作符会自动创建给定的类型并返回他们,当调用构造函数时,new会自动创建this对象,且类型就是构造函数类型。c.也可以在构造函数中显示调用return.如果返回的值是一个对象,它会代替新创建的对象实例返回。如果返回的值是一个原始类型,它会被忽略,新创

吉帅振博客 350

高性能JavaScript(数据存取)

数据存取分为4各部分   存取位置   作用域及改变作用域   原型以及原型链   缓存对象成员值 存取位置 JavaScript 有4中基本的数据存取位置 字面量:字面量代表自身,不存于特定的位置。比如这个的匿名函数 $btn.click(function(){... ...}); 本地变量:本地变量使用var声明,一个字面量和一个局部变量中存取数据的性能差异是很小的。 ...

weixin_30760895的博客 143

两链一包

1、作用域链 -- 要到创建这个函数的那个作用域中取值——是“创建”,而不是“调用”   如果代码中只有声明没有赋值,显示 undefined   如果既无声明也没赋值,就会报错 var a=10; function f1(){ var b=20; function f2(){ ...

weixin_34254823的博客 280

读《高性能 JavaScript》笔记 -”JS进阶必读“(第二章)

二,数据存取        2.0 javaScript四种基本的数据存取位置        字面量:字符串,数字,布尔值,对象,数组,函数,正则表达式,及特殊的null和undefined值。        本地变量:var let const 定义的数据存储单元        数组元素:存储在javaScript数组对象内部,以数字作为索引        对象成员:存储在javaSc...

Bruce__taotao的博客 295

JS面试题-原型及原型链、作用域及作用域链、闭包

JavaScript常被描述为一种基于原型的语言(prototype--basedlanguage)——每个对象拥有一个原型对象,对象以其原型为模板、从原型继承方法和属性。原型对象也可能拥有原型,并从中承方法和属性,一层一层、以此类推。这种关系常被称为原型链(prototypechain),它解释了为何一个对象会拥有定义在其他对象中的属性和方法。—如上内容摘自MDN简单理解原型链就是在当前对象中找不到定义的话,会在当前对象的原型对象上继续查找,直至undefined。name20};...

weixin_49172439的博客 5843

前端面试——作用域链、原型链、闭包

1.作用域链、原型、原型链、闭包? https://www.cnblogs.com/pssp/p/5204324.html https://cnodejs.org/topic/59662f6dbda29e0f7480235b https://blog.youkuaiyun.com/zhizhiC/article/details/79734611 结论 作用域链的作用主要用于查找标识符,当作用域需要...

qq_21428081的博客 1万+

JavaScript复习,this指向、原型链、变量提升、作用域、闭包

文章目录 函数中this指向问题 原型 变量/函数 提升 全局执行上下文: 测试题 var可重复声明 作用域 闭包 更深入理解闭包的原理 闭包的作用 终极题目 ES5的继承

ronghwa_lu 3782

web前端面试高频考点——JavaScript 篇(一)【JS的三座大山 】 原型和原型链、作用域和闭包、异步

web前端面试高频考点 —— JavaScript 篇(一)【JS的三座大山 】 变量类型和计算、原型和原型链、作用域和闭包、异步(直击重难点,修炼内功必备)

HuoZhiyan 的博客 2847
上一篇: Node.js开发指南之二:核心模块介绍
下一篇: Node.js开发指南之三:核心模块介绍续
zzulp
博客等级 码龄19年 464粉丝 176原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值