这样理解JavaScript变量作用域更轻松

别再死记硬背了!用Multisim仿真带你吃透NPN/PNP三极管选型(附温度影响分析) 本文通过Multisim仿真技术深入解析NPN/PNP三极管选型难题,重点分析温度对β值和Iceo等关键参数的影响。通过温度扫描、参数扫描等仿真实验,直观展示三极管在不同温度下的性能变化,帮助工程师做出更精准的选型决策。文章还提供了实战案例和选型决策树,助力电子设计初学者告别死记硬背,掌握科学选型方法。 阅读详情

变量作用域是每门编程语言都会涉及的话题,也是作为一名程序员必需掌握的知识点,能深入掌握变量作用域更有助于你编写稳定的程序。JavaScript本身作为一门简单的语言,就其变量作用域问题一样令不少人头晕,这主要是因为JavaScript闭包的存在。本文不打算深入讲解JavaScript变量作用域问题(其实本人也没有能力能把这一话题讲的深入些),也不讲“闭包”话题,本文只讨论最实用的JavaScript作用域知识点。

一、JavaScript作用域分类

JavaScript就两种作用域:全局(window)、函数级(function)。函数级(function)不要理解为“块级(大括号{}级)”。

二、区分及定义JavaScript全局变量与局部变量

1.1定义在所有函数最外边,使用或不使用var关键字定义的变量都是全局变量。全局变量其实被解析成window对象的一个属性,所以我们可以以“window.全局变量名”方式访问它,推荐在没有必要的情况下直接使用变量名访问。如下例子演示了全局变量定义最常见的方法:

var  msg1 = ' This is message 1 ' ;
msg2
= ' This is message 2 ' ;
alert(window.msg1); 
// This is message 1 使用window关键字进行访问
alert(window.msg2);  // This is message 2
alert(msg1);  // This is message 1 省略window关键字的访问方式
alert(msg2);  // This is message 2
function  otherFunction(){}  // 其它一些函数或对象声明代码
var  otherObject = {};

1.2在函数内(局部变量运行时环境)一样可以定义和获取全局变量。定义的方法就是不使用var关键字,而在局部环境中亦可轻松获得全局变量内容,直接使用全局变量名引用即可。需要注意的是:如果函数内定义了与全局变量同名的局部变量,那么此时函数体将优先使用自己的局部变量,如果此时你非要使用同名的全局变量,请加上window前缀。举例如下:

var  msg1 = ' This is message 1 ' ;
var  msg3 = ' This is message 3 ' ;
function  otherFunction()
{
    msg2
= ' This is message 2 ' ;  // 不使用var关键字,其实也是定义一个全局变量
     var  msg3 = ' Message 3 ' ;
    alert(msg1); 
// This is message 1 (函数内当然可以访问到外面定义的全局变量,再深的函数嵌套一样能正确获到这个全局变量,这是JavaScript闭包的其中一种体现)
    alert(msg3);  // Message 3 (局部变量msg3)
    alert(window.msg3);  // This is message 3 (使用window前缀访问同名的全局变量msg3)
    alert( this .msg3);  // This is message 3 (因为otherFunction ()定义在一个全局的环境中,此时otherFunction ()的this也是指向window,所有你看到window. msg3是等于this. msg3的)
}
otherFunction();
// otherFunction函数外面定义的msg1和里面定义的msg2依然是全局变量
alert(window.msg1);  // This is message 1
alert(window.msg2);  // This is message 2

2.1使用var关键字,在函数体内定义的变量是局部变量,此变量能供其下面所有语句块({})及子函数使用。这个变量在这个函数里任何地方都可以访问到,但却不能在这个函数的外面“直接”访问(闭包允许间接访问,或代理访问,此知识点不在本文讨论范围)。举例如下:

function  showMsg()
{
    
if  ( true )
    {
        
var  msg = ' This is message ' ;
    }
    alert(msg); 
// This is message
}
showMsg();
alert(
typeof (msg));  // undefiend
//
这里在if {}大括号内定义的变量msg还能在if外showMsg()内访问到,但在showMsg()外则是无法访问的

2.2父函数的变量可以被子函数访问,但子函数的变量却不能被父函数访问,显然这与我们一开始说的函数级作用域是相吻合的。这看起来老爸爽快些,儿子吝啬些。举例如下:

function  showMsg()
{
    
var  MsgA = ' Message A ' ;
    
this .setMsg = function (msg)
    {
        
var  MsgB = ' Message B ' ;
        alert(MsgA); 
// Message A (子函数setMsg()可以访问父函数showMsg()的局部变量MsgA)
    }
    alert(MsgB); 
// MsgB未定义 (在父函数中不能访问其子函数中定义的变量MsgB)
}
var  sm = new  showMsg();
sm.setMsg(
' Message string ' );

三、需要注意的几个地方及使用技巧

1、为了避免变量混乱或被覆盖,对于局部变量的定义一定不要忘记加上var关键字(必要时我们要变量使用完后主动释放它,即“变量名=null”),同时建议把所有变量集中定义在每个函数体内的开头位置。举例如下:

var  msg = ' Message ' ;
function  showMsg()
{
    
var  msg;  // 这里即使不小心使用了与全局变量一样的变量名,也不用担心覆盖同名全局变量的问题
     var  a;
    
var  b;
    
var  c;
    
for  (a = 0 ;a < 10 ;a ++ ){}
    
this .setMsg = function (){}
}

2、巧用匿名函数,减少命名冲突或变量污染。如下两段代码其实实现了相同的功能,而第一段代码写法自己可以在那个匿名函数内大胆用自己想用的变量名等,不用担心自己定义的变量覆盖其他人定义或自己其它地方定义的变量。

// 定义一个匿名函数,然后把代码丢到这个匿名函数里面,能有效减少命名冲突或变量污染,这是常见JS框架的做法
( function ()
{
    
var  msg = ' This is message ' ;
    alert(msg);
})();
document.write(msg); 
// msg未定义 (匿名函数外的其它方法已无法调用msg这个变量)
//
-----------------------------
var  msg = ' This is message ' ;
alert(msg);

3、不建议在无须实例化的函数内使用this代替window去访问全局变量。一般情况使用this关键字的函数应当作为JavaScript类来处理(我喜欢把“cls”作为类名的前缀)。以下函数如果仅当作普通函数调用一下,就不应该出现this关键字,因为这通常是去操作一个全局变量了。例子:

function  clsMsg()
{
    
this .msg = ' This is default message ' ;
    
this .showMsg = function ()
    {
        alert(
this .msg);
    }
}
sMsg
= new  clsMsg();
sMsg.msg
= ' This is new message ' ;
sMsg.showMsg();

四、相关知识点指引

理解以下相关知识点有助于你更好地认识JavaScript变量作用域,本文暂不详述,随后会以单独篇幅来讲,敬请关注。

(1)理解JavaScript“预解析”
(2)JavaScript闭包

Multisim中导入与验证9013、8050等常用三极管SPICE模型实战指南 在电子电路设计与仿真中,SPICE模型是精确预测电路行为的核心。它通过数学方程描述晶体管等有源器件的电气特性,其准确性直接决定了仿真结果的可信度。对于工程师和爱好者而言,掌握如何为常用分立器件(如9013、8050等通用三极管)获取并导入精确的SPICE模型,是提升设计效率、避免“仿真通过,实测翻车”的关键技术环节。这涉及到从模型获取、参数解析,到在EDA软件(如Multisim)中成功部署与验证的全流程。本文以**SPICE模型**和**Multisim仿真**为核心,详细拆解了为常用三极管建立可靠仿真模 阅读详情

相关推荐

深入理解JavaScript:变量、作用域与闭包

本文深入探讨了JavaScript中的变量、作用域和闭包,包括类型转换、变量命名规则、作用域提升、嵌套作用域、条件判断、严格模式以及作为值的函数等概念。我们通过实例代码来解释这些概念,并探讨了如何在现代JavaScript开发中使用这些特性,包括ES6引入的模块和类等。

weixin_35755823的博客 391

轻松理解js的作用域和作用域链

作用域和作用域链我觉得是必须要理解的。变量的值是多少根作用域(scope)和作用域链([[scope]])脱不了关系。本文从作用域是什么,有什么用来理清作用域和作用域链。

weixin_58325937的博客 1361

别再手动算频谱了!用这个在线FFT工具,5分钟搞定JSON/CSV数据分析

本文介绍了一款高效的在线FFT工具,帮助用户快速分析JSON/CSV格式的时域数据,5分钟内完成频谱分析。通过傅里叶变换(FFT)算法,大幅提升计算效率,解决传统手动计算的痛点,适用于工业振动分析、设备故障诊断等场景。

weixin_29172201的博客 258

【前端|Javascript第3篇】探秘JavaScript的作用域与作用域链:小白也能轻松搞懂!

🌈🌈🌈通过本文的解释,我们详细了解了JavaScript中的作用域与作用域链。希望你在通俗易懂的语言和生动的例子中,更好地理解了这些概念。作用域和作用域链是编程的基础,是你进入JavaScript世界的钥匙。相信你已经准备好在编程的大海中翱翔了!让我们一同扬帆,启程探索编程的未知领域吧!🎉🎉🎉。

A_D_H_E_R_E的博客 2903

EDA课程实验:《数字逻辑电路》实验四___基于Minisys 平台 VIVADO工具与Verilog语言

(4)使用 Verilog HDL 实现一个分频器 clock_div,输入的是系统提供的 100MHz 频率,输出的是 1Hz 频率,占空比是 1:2,(实际上可以用一个加 1 计数器来实现降频,输入的是一个 100MHz 频率的方波,对这 个方波计数 1 亿次刚好到 1 秒(1Hz),题目要求输出频率占空比是 1:2,也就是这个 1Hz 的 方波高电平和低电平各 500ms,可以采用计数到中间值的时候输出电平翻转。(1)1) 拨动 SW1~0 为 01,按下 P4 按钮,GLD1~0 为 01;

ssjy_的博客 1295

算法面试八股文『 基础知识篇 』

个人整理的算法面试基础知识八股文,内容较详细。

SG_teresa's blog 4336

JavaScript的执行机制——块级作用域

块级作用域作用域(scope)变量提升所带来的问题变量容易在不被察觉的情况下被覆盖掉本应销毁的变量没有被销毁ES6 是如何解决变量提升带来的缺陷JavaScript 是如何支持块级作用域的 作用域(scope) 为什么 JavaScript 中会存在变量提升这个特性,而其他语言似乎都没有这个特性呢?要讲清楚这个问题,我们就得先从作用域讲起。 作用域是指在程序中定义变量的区域,该位置决定了变量的生命周期。通俗地理解,作用域就是变量与函数的可访问范围,即作用域控制着变量和函数的可见性和生命周期。 在 ES6 之

前端探险家的博客 2913

让AI镜头“活”起来:22个核心运镜提示词,告别视频画面呆板

介绍了22种影视级镜头语言的AI提示词用法。内容涵盖推轨/后拉镜头等距离变化技巧、横摇/俯仰等方向控制手法、环绕/升降等空间位移方式,以及POV视角等特殊构图。

weixin_43489601的博客 6264

轻松理解什么是js作用域和变量、函数提升的示例

js作用域和函数提升的代码示例1. 作用域全局作用域局部作用域作用域链2. 预解析变量提升函数提升 1. 作用域 作用域,顾名思义,指一个变量的作用范围。在js中有两种作用域。 全局作用域 全局作用域作用于整个script标签,在页面打开时创建,在页面关闭时销毁 两种情况可以产生全局作用域 全局声明(直接编写在script标签内的代码) 在函数内部,没有声明就直接进行赋值 全局作用域中有一个全局对象window,代表一个浏览器的窗口,由浏览器创建,我们可以直接使用。 全局作用域中创建

CaiBiCuiCui的博客 233

081、空间降噪(Spatial Denoise)实战:双边滤波、非局部均值与BM3D在ISP中的调优

调参时,别只看PSNR/SSIM。找几个典型场景(夜景、人像、文字、天空),在真实设备上肉眼对比。我见过PSNR涨了2dB但图像看起来更差的案例——因为PSNR不惩罚纹理丢失。空间降噪这块,理论说再多,不如动手调一次。下次遇到噪点问题,先别急着上BM3D,试试双边滤波的自适应参数,说不定有惊喜。

zzfmlxs的博客 42

【DaVinci Configurator专题】-5-通过Data Mapping自动创建CAN信号关联的Port并添加到APP SWC

目录 1 导入CAN Matrix变更后的Arxml文件 2 自动创建CAN信号关联的APP Port 3 CAN信号与App SWC的接口映射/连接 4 结尾 <--返回「实战篇」博文-总目录--> <--返回「Autosar从入门到精通-实战篇」专栏主页--> 关键词: DaVinci Developer DaVinci Configurator Pro ARXML AUTOSAR System Description Network Explorer 1

「汽车电子助手」的博客 5126

【一天时间|JavaScript基础】作用域和闭包

本期介绍作用域和闭包的知识点和题目。包括作用域,自由变量,闭包,this 等部分。作用域是 “JS 三座大山” 之二,不知道闭包的话,面试通过概率不大。

江拥羡橙的博客 2万+

ParaView: GUI 轴网格

ParaView: GUI 轴网格

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1922

【JavaScript】巧用思维导图轻松学习JavaScript的后续来了

巧用思维导图轻松学习JavaScript的后续来了作用域——预解析以及代码执行JavaScript的对象内置对象Math对象日期对象京东倒计时数组对象 前期更新了JavaScript 但是内容还没有完 所以,你想要的巧用思维导图轻松学习JavaScript的后续来了,并且文章末尾提供了好物分享呦 作用域——预解析以及代码执行 1,预解析 会把js引擎里面所有的var以及function提升到当前作用域的最前面 2,代码执行 按照代码书写的顺序从上往下进行执行 变量提升和函数提升 预解析 分为 变量

xuwenjie的博客 3442

14、Java 中 TAF 和 FCF 的使用及 Oracle 数据库升级与迁移指南

本文详细介绍了Java中实现高可用性的TAF(透明应用故障转移)和FCF(快速连接故障转移)技术,以及如何将Oracle 9iR2 RAC环境升级到10gR2 RAC,并将数据从OCFS迁移到ASM。通过示例代码和操作步骤,帮助开发者和数据库管理员更好地应对数据库故障和数据迁移问题,提升系统的可用性和性能。

egg99的博客 107

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

JavaScript 学习之旅:第八课:变量作用域

现实中的作用域在现实生活中,作用域的概念无处不在。家庭隐私:在家里,有些东西是全家人都可以使用的(比如电视),而有些东西只有你自己可以使用(比如你的日记)。这就像是一种“作用域”,决定了谁可以访问某些东西。公司内部文件:在公司里,有些文件是所有人都可以查看的(比如公告栏),而有些文件只有特定的人可以查看(比如机密文件)。这也是一种“作用域”,决定了谁能访问这些文件。什么是变量作用域:变量作用域决定了变量可以在哪些地方被访问和使用。JavaScript 中主要有三种作用域:全局作用域、局部作用域和块级作用域。

caifox的博客 900

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

彻底搞懂JavaScript作用域:33-js-concepts中的函数作用域与块级作用域终极指南

JavaScript作用域是每个开发者必须掌握的核心概念之一,它决定了变量和函数的可访问范围。在33-js-concepts项目中,作用域被列为第6个关键概念,因为它直接影响代码的组织、维护和调试。理解JavaScript作用域机制对于编写高效、可预测的代码至关重要,特别是在处理函数作用域、块级作用域和词法作用域时。本文将深入浅出地解析这些概念,帮助你彻底掌握JavaScript作用域的工作原理。

gitblog_01171的博客 1050

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

彻底理解js的作用域链

文章目录彻底理解js的作用域链1、执行上下文.作用域链(scope chain)2、为什么js有函数级作用域3、作用域链是怎么创建的4、解释闭包的原理5、后记 在之前的文章中我已经介绍了执行上下文的变量对象。在这一篇文章我要介绍执行上下文的作用域链了。 彻底理解js的作用域链 1、执行上下文.作用域链(scope chain) 作用域链与变量对象有着密不可分的关系,因为作用域链就是变量对象的数组...

qq_45768871的博客 1191

Javascript 中的作用域是什么

作用域定义了变量和函数的可见性和生存周期。在JavaScript中,有两种主要的作用域类型:全局作用域和局部作用域(包括函数作用域和块级作用域)。正确理解和使用作用域可以避免许多常见的编程错误,如变量覆盖或未定义错误。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 1242

深入理解JS闭包

闭包的理解

cauchy6317的博客 6万+

深入理解javascript原型和闭包(14)——从【自由变量】到【作用域链】

先解释一下什么是“自由变量”。 在A作用域中使用的变量x,却没有在A作用域中声明(即在其他作用域中声明的),对于A作用域来说,x就是一个自由变量。如下图 如上程序中,在调用fn()函数时,函数体中第6行。取b的值就直接可以在fn作用域中取,因为b就是在这里定义的。而取x的值时,就需要到另一个作用域中取。到哪个作用域中取呢? 有人说过要到父作用域中取,其实有时候这种解释会产生歧义。例如: ...

一只苟延残喘的卑微蝼蚁 299

JavaScript 一、 ES6 声明变量,作用域理解

// JavaScript/* * ========================================================= * * 编译原理 * 尽管通常将 JavaScript 归类为“动态”或“解释执行”语言,但事实上它是一门编译语言。 这个事实对你来说可能显而易见,也可能你闻所未闻,取决于 * 你接触过多少编程语言,具有多少经验。但与传统的编译语言不同,...

a_c12345的博客 146

JavaScript变量作用域

JavaScript变量作用域 变量作用域是每门编程语言都会涉及的话题,也是作为一名程序员必需掌握的知识点,能深入掌握变量作用域更有助于你编写稳定的程序。 JavaScript本身作为一门简单的语言,就其变量作用域问题一样令不少人头晕,这主要是因为JavaScript闭包的存在。本文不打算深入讲解 JavaScript变量作用域问题(其实本人也没有能力能把这一话题讲的深入些),也不讲

KylinBL的专栏 2433

最简单的例子让你轻松理解JavaScript闭包

最简单的例子让你轻松理解闭包 在理解闭包之前,为了让大家更好的理解闭包,我举一个形象的例子。在JS里有着作用域的概念,那么作用域是什么呢?有什么用呢?下面这个例子能形象的体现 比如每一座城市,城市里乡镇啊有公园,超市等,这些建筑设施就构建了这一个城市(环境),那么这些环境构成的依据是什么呢?是有人依赖它,用它。当这个城市的的人迁出这个城市,那么这个城市没有人再依赖他,那么它的存在就没有意义了, ...

weixin_45717379的博客 2870
上一篇: 理解JavaScript“预解析”
下一篇: 尝试用JScript .NET编写ASP.NET程序
webflash
博客等级 码龄18年 19粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值