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实现自定义对话框的代码
Jun 15 Javascript
COM中获取JavaScript数组大小的代码
Nov 22 Javascript
jquery 无限级联菜单案例分享
Mar 26 Javascript
为Javascript中的String对象添加去除左右空格的方法(示例代码)
Nov 30 Javascript
jQuery实现的进度条效果
Jul 15 Javascript
JS+CSS实现的蓝色table选项卡效果
Oct 08 Javascript
jquery实现全选、反选、获得所有选中的checkbox
Sep 13 Javascript
对Js OOP编程 创建对象的一些全面理解
Jul 26 Javascript
jQuery实现背景滑动菜单
Dec 02 Javascript
Vue CLI 3.x 自动部署项目至服务器的方法
Apr 02 Javascript
理解JavaScript中的对象
Aug 25 Javascript
js之ajax文件上传
May 13 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下MAIL的另一解决方案
2006/10/09 PHP
一个php导出oracle库的php代码
2009/04/20 PHP
一个php Mysql类 可以参考学习熟悉下
2009/06/21 PHP
PHP基础陷阱题(变量赋值)
2012/09/12 PHP
详解Window7 下开发php扩展
2015/12/31 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
Laravel 验证码认证学习记录小结
2019/12/20 PHP
在JavaScript中获取请求的URL参数[正则]
2010/12/25 Javascript
如何减少浏览器的reflow和repaint
2015/02/26 Javascript
jQuery实现3D文字特效的方法
2015/03/10 Javascript
JQuery实现鼠标移动图片显示描述层的方法
2015/06/25 Javascript
JavaScript实现文本框中默认显示背景图片在获得焦点后消失的方法
2015/07/01 Javascript
jQuery基于扩展实现的倒计时效果
2016/05/14 Javascript
详解Angular.js指令中scope类型的几种特殊情况
2017/02/21 Javascript
Vue引入jquery实现平滑滚动到指定位置
2018/05/09 jQuery
JavaScript树的深度优先遍历和广度优先遍历算法示例
2018/07/30 Javascript
Vue项目安装插件并保存
2019/01/28 Javascript
Nodejs核心模块之net和http的使用详解
2019/04/02 NodeJs
Vue中使用create-keyframe-animation与动画钩子完成复杂动画
2019/04/09 Javascript
微信小程序导航栏跟随滑动效果的实现代码
2019/05/14 Javascript
python网络编程实例简析
2014/09/26 Python
总结python实现父类调用两种方法的不同
2017/01/15 Python
详谈python http长连接客户端
2017/06/12 Python
Python实现简单石头剪刀布游戏
2021/01/20 Python
python针对mysql数据库的连接、查询、更新、删除操作示例
2019/09/11 Python
pandas中read_csv的缺失值处理方式
2019/12/19 Python
如何利用python读取micaps文件详解
2020/10/18 Python
Python自动化办公Excel模块openpyxl原理及用法解析
2020/11/05 Python
python3.9实现pyinstaller打包python文件成exe
2020/12/13 Python
推荐10个CSS3 制作的创意下拉菜单效果
2014/02/11 HTML / CSS
使用javascript和HTML5 Canvas画的四渐变色播放按钮效果
2014/04/10 HTML / CSS
Booking.com英国官网:全球酒店在线预订网站
2018/04/21 全球购物
一家专门经营包包的英国网站:MyBag
2019/09/08 全球购物
素质拓展感言
2014/01/29 职场文书
幼儿园托班开学寄语(2016春季)
2015/12/03 职场文书
2019广播稿怎么写
2019/04/17 职场文书