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 相关文章推荐
JavaScript入门教程(7) History历史对象
Jan 31 Javascript
基于jquery的DIV随滚动条滚动而滚动的代码
Jul 20 Javascript
JS创建自定义表格具体实现
Feb 11 Javascript
jQuery中:last-child选择器用法实例
Dec 31 Javascript
jQuery删除一个元素后淡出效果展示删除过程的方法
Mar 18 Javascript
ionic实现滑动的三种方式
Aug 27 Javascript
AngularJS实现动态编译添加到dom中的方法
Nov 04 Javascript
jquery表单验证实例仿Toast提示效果
Mar 03 Javascript
微信小程序 slider的简单实例
Apr 19 Javascript
一种angular的方法级的缓存注解(装饰器)
Mar 13 Javascript
详解Vue中的watch和computed
Nov 09 Javascript
浅析vue中的nextTick
Dec 28 Vue.js
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
php读取mysql乱码,用set names XXX解决的原理分享
2011/12/29 PHP
php获取淘宝分类id示例
2014/01/16 PHP
QQ互联一键登录审核不通过的解决方案
2014/09/10 PHP
配置php.ini实现PHP文件上传功能
2014/11/27 PHP
php处理json格式数据经典案例总结
2016/05/19 PHP
javascript中的有名函数和无名函数
2007/10/17 Javascript
多选列表框动态添加,移动,删除,全选等操作的简单实例
2014/01/13 Javascript
jquery $.trim()方法使用介绍
2014/05/21 Javascript
js实现文本框中输入文字页面中div层同步获取文本框内容的方法
2015/03/03 Javascript
JavaScript中判断函数、变量是否存在
2015/06/10 Javascript
JS截取字符串实例详解
2015/11/24 Javascript
JavaScript如何实现跨域请求
2016/08/05 Javascript
BootStrap栅格系统、表单样式与按钮样式源码解析
2017/01/20 Javascript
详解RequireJs官方使用教程
2017/10/31 Javascript
vue-cli3+typescript新建一个项目的思路分析
2019/08/06 Javascript
如何在postman中添加cookie信息步骤解析
2020/06/30 Javascript
React实现阿里云OSS上传文件的示例
2020/08/10 Javascript
VUE+Element实现增删改查的示例源码
2020/11/23 Vue.js
[02:05:03]完美世界DOTA2联赛循环赛 LBZS VS Matador BO2 10.28
2020/10/28 DOTA
Python2.x中str与unicode相关问题的解决方法
2015/03/30 Python
Python中最常用的操作列表的几种方法归纳
2015/04/24 Python
使用Python的Flask框架构建大型Web应用程序的结构示例
2016/06/04 Python
python对象及面向对象技术详解
2016/07/19 Python
python实现图像识别功能
2018/01/29 Python
pip安装时ReadTimeoutError的解决方法
2018/06/12 Python
python之验证码生成(gvcode与captcha)
2019/01/02 Python
Numpy数组array和矩阵matrix转换方法
2019/08/05 Python
Python实现串口通信(pyserial)过程解析
2019/09/25 Python
Django xadmin安装及使用详解
2020/10/26 Python
欧缇丽美国官网:Caudalie美国
2016/12/31 全球购物
Zavvi西班牙:电子游戏、极客服装、Blu-ray、Funko Pop等
2019/05/03 全球购物
2015年派出所工作总结
2015/04/24 职场文书
中小企业员工手册范本
2015/05/14 职场文书
对领导班子的意见和建议
2015/06/08 职场文书
2016年学校招生广告语
2016/01/28 职场文书
Nginx 502 Bad Gateway错误原因及解决方案
2021/03/31 Servers