JS中作用域以及变量范围分析


Posted in Javascript onJuly 18, 2020

变量作用域

js作为一门脚本语言,他与c,java这些语言是不相同的。

全局变量

在js中声明全局变量,有下面几种方式:

1.在函数外通过var来声明。

var test ="hello";
console.log(test);
function a(){
  test="xx";
  console.log(test);
}
a();
console.log(test);

结果:

hello
xx
xx

这种方式通过声明的变量在任何地方都可进行修改和使用。

2.在函数中隐士的声明变量

function a(){
  test=22;
  console.log(test);
}
a();
console.log(test);

结果:

22
22

因为js是弱类型脚本语言,在使用之前无需定义,所以可以通过这种方式也能声明全局变量。

来看一个反例:

var test="aa";
console.log(test);
function a(test){
  test=22;
  console.log(test);
}
a(test);
console.log(test);

结果:

aa
22
aa

可以看到在函数中修改了test值可是第二次在函数外打印的值没有变。这是因为在函数的过程中只是进行了值传递。局部变量覆盖掉了全局变量,只是局部变量 在 修改。

因为在函数的参数内定义的变量并不是全局变量。

反例二:

function a(){
  var test="aa";
  console.log(test);
}
a();
console.log(test);

结果

aa
notdefine

在函数内通过var来声明的变量是局部变量,函数外无法访问。

变量作用域

js的作用域和c与java这些语言的作用域也不相同,骚小孩在以前经常会因为这个而头疼,后来在认真学习了以后才懂了。

1.js中没有块范围。

if(1!=1){
  var y=c;
}
console.log(y)
 
if(1==1){
  var x=a;
}
console.log(x);

结果:

undefine
a

可以看到在if代码块定义的两个变量,在if块之外去打印,如果判断成功的话,才会去执行里边的声明语句,声明语句执行了,那么在代码块外边就可访问到了。

也可以看出在代码块中声明的变量也是全局变量。

2.js中的全局变量都会成为window的属性

var x=0;
console.log(window.x);

结果:

0

3.变量提升

var c=0;
function a(){
  console.log(c);
}
a();

结果:

0

var c=0;
function a(){
  console.log(c);
  var c=11;
}
a();

结果:

undefine

可以看出在函数中加了一行声明语句结果就会不同,这产生这样的原因是什么呢?

其实第二个代码块的执行顺序是这样的:

var c=0;
function a(){
  var c;
  console.log(c);
  c=11;
}
a();

在函数中他会先把声明语句提升到第一行,但是并不提升赋值。然后局部变量覆盖全局变量,在打印c的时候局部变量还没来的

及赋值所以就是undefine。

变量提升不只会提升会执行的变量,不会执行的变量也会进行提升:

var c=10;
function a(){
  console.log(c);
  if(false) {
    var c = 10;
  }
}
a();

结果:

undefine

因为在if判断中定义了局部变量c,虽然if条件不成立,但是也会进行变量提升,所以打印c也是undefine;

4.let变量

通过上面的例子可以看到用var来定义变量的弊端:

1.var定义的变量没有块作用域;

2.var定义的全局变量会自动添加全局window对象的属性;

3.var变量会提前装载(变量提升);

let就是为了解决这些问题而诞生的。

for(let i=0;i<5;i++){
  
}
console.log(i);

结果:

报错

在代码块中定义了let变量,在外部引用的时候不会存在。即存在块作用域。

let i=10;
console.log(window.i);

结果:

undefine

let声明的变量并不会成为window的属性。

var c=10;
function a(){
  console.log(c);
  let c=1;
  console.log(c);
}
a();

在函数中存在变量与全局变量名相同的c,因此会覆盖掉全局变量c,但是由于let不会提前装载,所以在第一个打印语句打印c时会报错。

到此这篇关于JS中作用域以及变量范围分析的文章就介绍到这了,更多相关JS变量作用域内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
通过jQuery打造支持汉字,拼音,英文快速定位查询的超级select插件
Jun 18 Javascript
三级下拉菜单的js实现代码
May 23 Javascript
javascript实现div的拖动并调整大小类似qq空间个性编辑模块
Dec 12 Javascript
JavaScript设计模式之观察者模式(发布者-订阅者模式)
Sep 24 Javascript
实例讲解jquery中mouseleave和mouseout的区别
Feb 17 Javascript
快速掌握Node.js模块封装及使用
Mar 21 Javascript
Angular2内置指令NgFor和NgIf详解
Aug 03 Javascript
Node.js下自定义错误类型详解
Oct 17 Javascript
jQuery插件autocomplete使用详解
Feb 04 Javascript
浅析Vue 中的 render 函数
Feb 28 Javascript
解决vue的touchStart事件及click事件冲突问题
Jul 21 Javascript
React服务端渲染原理解析与实践
Mar 04 Javascript
JS中的变量作用域(console版)
Jul 18 #Javascript
js里面的变量范围分享
Jul 18 #Javascript
理解Proxy及使用Proxy实现vue数据双向绑定操作
Jul 18 #Javascript
深入理解 ES6中的 Reflect用法
Jul 18 #Javascript
详谈Object.defineProperty 及实现数据双向绑定
Jul 18 #Javascript
webpack+vue-cil 中proxyTable配置接口地址代理操作
Jul 18 #Javascript
Vue项目前后端联调(使用proxyTable实现跨域方式)
Jul 18 #Javascript
You might like
Smarty简单生成表单元素的方法示例
2016/05/23 PHP
php实现简单的权限管理的示例代码
2017/08/25 PHP
PHP crc32()函数讲解
2019/02/14 PHP
js Date自定义函数 延迟脚本执行
2010/03/10 Javascript
基于jQuery的弹出警告对话框美化插件(警告,确认和提示)
2010/06/10 Javascript
jquery.simple.tree插件 更简单,兼容性更好的无限树插件
2010/09/03 Javascript
JavaScript内核之基本概念
2011/10/21 Javascript
JavaScript高级程序设计 阅读笔记(十二) js内置对象Math
2012/08/14 Javascript
jquery JSON的解析方式示例介绍
2014/07/27 Javascript
jQuery使用drag效果实现自由拖拽div
2015/06/11 Javascript
javascript中new关键字详解
2015/12/14 Javascript
深入学习JavaScript的AngularJS框架中指令的使用方法
2016/03/05 Javascript
JavaScript实现数据类型的相互转换
2016/03/06 Javascript
基于jQuery实现表格内容的筛选功能
2016/08/21 Javascript
JS对象的深度克隆方法示例
2017/03/16 Javascript
JavaScript函数绑定用法实例分析
2017/11/14 Javascript
JS实现的邮箱提示补全效果示例
2018/01/30 Javascript
详解基于React.js和Node.js的SSR实现方案
2019/03/21 Javascript
JavaScript之数组扁平化详解
2019/06/03 Javascript
JS+Canvas实现五子棋游戏
2020/08/26 Javascript
[54:58]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第一场 11.25
2020/11/25 DOTA
Python的Twisted框架上手前所必须了解的异步编程思想
2016/05/25 Python
pandas按行按列遍历Dataframe的几种方式
2019/10/23 Python
Python调用系统命令os.system()和os.popen()的实现
2020/12/31 Python
python+opencv实现车道线检测
2021/02/19 Python
使用jquery实现HTML5响应式导航菜单教程
2014/04/02 HTML / CSS
深深扎根运动世界的生活品牌:Tillys
2017/10/30 全球购物
俄罗斯三星品牌商店:Samsungstore
2020/04/05 全球购物
数据库的约束含义
2012/09/09 面试题
日语专业毕业生求职信
2013/12/04 职场文书
防汛工作情况汇报
2014/10/28 职场文书
社区党的群众路线教育实践活动总结材料
2014/10/31 职场文书
2015年上半年物业工作总结
2015/03/30 职场文书
运动员加油词
2015/07/18 职场文书
.Net Core导入千万级数据至Mysql的步骤
2021/05/24 MySQL
德劲DE1102数字调谐收音机机评
2022/04/07 无线电