当前位置: 首页 > news >正文

c语言块级作用域_JavaScript的作用域和块级作用域概念理解

作用域

作用域永远都是任何一门编程语言中的重中之重,因为它控制着变量与参数的可见性与生命周期。说到这里我们需要理解两个概念:块级作用域与函数作用域。

函数作用域

这个应该好理解,函数作用域就是说定义在函数中的参数和变量在函数外部是不可见的。

大多数类C语言都拥有块级作用域,JS却没有。请看下文demo:

//C语言

#include

void main()

{

int i=2;

i--;

if(i)

{

int j=3;

}

printf("%d/n",j);

}

运行这段代码,会出现“use an undefined variable:j”的错误。可以看到,C语言拥有块级作用域,因为j是在if的语句块中定义的,因此,它在块外是无法访问的。

块级作用域

任何一对花括号中的语句集都属于一个块,在这之中定义的所有变量在代码块外都是不可见的,我们称之为块级作用域。

正如我们举的C语言的例子,大多数类C语言都是有块级作用域的,那么在JavaScript又有什么不同呢?

我们一起看看这个JavaScript的demo:

functin test(){

for(var i=0;i<3;i++){

}

alert(i);

}

test();

运行这段代码,弹出"3",可见,在块外,块中定义的变量i仍然是可以访问的。也就是说,JS并不支持块级作用域,它只支持函数作用域,而且在一个函数中的任何位置定义的变量在该函数中的任何地方都是可见的。

那么我们该如何使JS拥有块级作用域呢?是否还记得,在一个函数中定义的变量,当这个函数调用完后,变量会被销毁,我们是否可以用这个特性来模拟出JS的块级作用域呢?看下面这个demo:

function test(){

(function (){

for(var i=0;i<4;i++){

}

})();

alert(i);

}

test();

这时候再次运行,会弹出"i"未定义的错误,哈哈,实现了吧~~~这里,我们把for语句块放到了一个闭包之中,然后调用这个函数,当函数调用完毕,变量i自动销毁,因此,我们在块外便无法访问了。

JS的闭包特性is the most important feature((__) 大家懂的)。在JS中,为了防止命名冲突,我们应该尽量避免使用全局变量和全局函数。那么,该如何避免呢?不错,正如上文demo所示,我们可以把要定义的所有内容放入到一个

(function (){

//内容

})();

之中,这时候,我们是不是相当于给它们的外层添加了一个函数作用域呢?该作用域之外的程序是无法访问它们的。

Happy hacking!

相关文章:

  • crt脚本退出命令_SecureCRT脚本-连接多个设备并发送命令
  • 蔡司三坐标_三坐标蔡司测量三坐标精度三坐标检验维修升级上门搬迁
  • 阿里云服务器 默认mysql_阿里云服务器mysql默认密码
  • mysql 1213_分享一个MySQL死锁问题解决的方法
  • mysql服务器主备份_MySQL 基于主主备份
  • win2012卸载mysql_Sql Server 2012完全卸载方法 只需8步轻松卸载
  • mysql多表查询实训_MySql-多表查询练习
  • mysql 如何解锁_Mysql如何解锁?
  • mysql left a 10_MySQL语法基础
  • demonstration记忆_英语背诵方法之一:意群断句法
  • mysql8分区_mysql8中的表分区
  • ztree 后台异步加载_Ztree 分批异步加载
  • linux执行mysql表_linux shell命令执行sql(mysql入门)
  • python 数组逆序重放_OpenJudge计算概论-找最大数序列
  • python爬虫处理滑块验证_python爬虫基础(9:验证识别之滑块验证)
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【Amaple教程】5. 插件
  • download使用浅析
  • Electron入门介绍
  • java 多线程基础, 我觉得还是有必要看看的
  • JavaScript异步流程控制的前世今生
  • Vue组件定义
  • windows-nginx-https-本地配置
  • 对超线程几个不同角度的解释
  • 警报:线上事故之CountDownLatch的威力
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 什么软件可以剪辑音乐?
  • 如何在招聘中考核.NET架构师
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • 整理一些计算机基础知识!
  • # centos7下FFmpeg环境部署记录
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (HAL库版)freeRTOS移植STMF103
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (SpringBoot)第二章:Spring创建和使用
  • (第二周)效能测试
  • (六)c52学习之旅-独立按键
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (小白学Java)Java简介和基本配置
  • (一)UDP基本编程步骤
  • (已解决)什么是vue导航守卫
  • (转)使用VMware vSphere标准交换机设置网络连接
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET 分布式技术比较
  • [100天算法】-目标和(day 79)
  • [20150707]外部表与rowid.txt
  • [BUUCTF]-PWN:[极客大挑战 2019]Not Bad解析
  • [BZOJ] 2044: 三维导弹拦截
  • [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)
  • [C#]winform利用seetaface6实现C#人脸检测活体检测口罩检测年龄预测性别判断眼睛状态检测
  • [Firefly-Linux] RK3568修改控制台DEBUG为普通串口UART