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 相关文章推荐
简略的前端架构心得&amp;&amp;基于editor为例子的编码小技巧
Nov 25 Javascript
以jQuery中$.Deferred对象为例讲解promise对象是如何处理异步问题
Nov 13 Javascript
JS原型、原型链深入理解
Feb 27 Javascript
有关jquery与DOM节点操作方法和属性记录
Apr 15 Javascript
BootStrap selectpicker
Jun 20 Javascript
微信小程序 地图map详解及简单实例
Jan 10 Javascript
jQuery模拟实现天猫购物车动画效果实例代码
May 25 jQuery
详解用node.js实现简单的反向代理
Jun 26 Javascript
浅析JavaScript中的平稳退化(graceful degradation)
Jul 24 Javascript
微信小程序实现锚点功能
Nov 20 Javascript
node+vue实现文件上传功能
May 28 Javascript
JS实现按比例缩小图片宽高
Aug 24 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
php 归并排序 数组交集
2011/05/10 PHP
php DOS攻击实现代码(附如何防范)
2012/05/29 PHP
php实现改变图片直接打开为下载的方法
2015/04/14 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
2017/09/16 PHP
JavaScript中创建对象和继承示例解读
2014/02/12 Javascript
创建、调用JavaScript对象的方法集锦
2014/12/24 Javascript
JavaScript tab选项卡插件实例代码
2016/02/23 Javascript
手机端图片缩放旋转全屏查看PhotoSwipe.js插件实现
2016/08/25 Javascript
详解JavaScript中数组的reduce方法
2016/12/02 Javascript
jQuery 全选 全不选 事件绑定的实现代码
2017/01/23 Javascript
jQuery实现ajax无刷新分页页码控件
2017/02/28 Javascript
ES6学习教程之Map的常用方法总结
2017/08/03 Javascript
简单快速的实现js计算器功能
2017/08/17 Javascript
vue2.0 父组件给子组件传递数据的方法
2018/01/15 Javascript
jQuery的Ajax接收java返回数据方法
2018/08/11 jQuery
jQuery实现根据身份证号获取生日、年龄、性别等信息的方法
2019/01/09 jQuery
JS实现拖拽元素时与另一元素碰撞检测
2020/08/27 Javascript
JS性能优化实现方法及优点进行
2020/08/30 Javascript
Python实现的科学计算器功能示例
2017/08/04 Python
python机器学习之随机森林(七)
2018/03/26 Python
django1.11.1 models 数据库同步方法
2018/05/30 Python
详解python实现识别手写MNIST数字集的程序
2018/08/03 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
2018/11/30 Python
python实现身份证实名认证的方法实例
2019/11/08 Python
利用jupyter网页版本进行python函数查询方式
2020/04/14 Python
Django正则URL匹配实现流程解析
2020/11/13 Python
欧缇丽加拿大官方网站:Caudalie加拿大
2019/07/18 全球购物
最新的小工具和卓越的产品设计:Oh That Tech!
2019/08/07 全球购物
得到Class的三个过程是什么
2012/08/10 面试题
小班重阳节活动方案
2014/02/08 职场文书
信访工作经验交流材料
2014/05/23 职场文书
旅游饭店管理专业自荐书
2014/06/28 职场文书
领导干部作风建设总结
2014/10/23 职场文书
开平碉楼导游词
2015/02/06 职场文书
红十字会救护培训简讯
2015/07/20 职场文书
Java 定时任务技术趋势简介
2022/05/04 Java/Android