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中:表达式和语句的区别[译]
Sep 17 Javascript
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
Feb 26 Javascript
JS 两日期相减,获得天数的小例子(兼容IE,FF)
Jul 01 Javascript
js图片翻书效果代码分享
Aug 20 Javascript
深入php面向对象、模式与实践
Feb 16 Javascript
详解基于node的前端项目编译时内存溢出问题
Aug 01 Javascript
详解JS中的柯里化(currying)
Aug 17 Javascript
echarts饼图扇区添加点击事件的实例
Oct 16 Javascript
React Native使用fetch实现图片上传的示例代码
Mar 07 Javascript
vue移动端实现下拉刷新
Apr 22 Javascript
vue实现评论列表功能
Oct 25 Javascript
node.js使用http模块创建服务器和客户端完整示例
Feb 10 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作为Shell脚本语言使用
2006/10/09 PHP
PHP5中的时间相差8小时的解决办法
2008/03/28 PHP
php smarty模版引擎中的缓存应用
2009/12/11 PHP
php实现memcache缓存示例讲解
2013/12/04 PHP
php安装扩展mysqli的实现步骤及报错解决办法
2017/09/23 PHP
laravel框架模型和数据库基础操作实例详解
2020/01/25 PHP
jQuery Validation实例代码 让验证变得如此容易
2010/10/18 Javascript
基于jquery的从一个页面跳转到另一个页面的指定位置的实现代码(带平滑移动的效果)
2011/05/24 Javascript
使用jquery 简单实现下拉菜单
2015/01/14 Javascript
使用jQuery管理选择结果
2015/01/20 Javascript
jQuery中on()方法用法实例详解
2015/02/06 Javascript
JavaScript简单下拉菜单特效
2016/09/13 Javascript
完美解决js传递参数中加号和&amp;号自动改变的方法
2016/10/11 Javascript
bootstrap时间插件daterangepicker使用详解
2017/10/19 Javascript
Vue打包后出现一些map文件的解决方法
2018/02/13 Javascript
Vue底层实现原理总结
2018/02/17 Javascript
vue-cli3环境变量与分环境打包的方法示例
2019/02/18 Javascript
vue 获取及修改store.js里的公共变量实例
2019/11/06 Javascript
浅析Vue 中的 render 函数
2020/02/28 Javascript
[57:18]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#3VP VS VG
2016/03/03 DOTA
Python遍历zip文件输出名称时出现乱码问题的解决方法
2015/04/08 Python
win10环境下python3.5安装步骤图文教程
2017/02/03 Python
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
2017/02/13 Python
让python 3支持mysqldb的解决方法
2017/02/14 Python
python正则表达式的使用
2017/06/12 Python
对pandas数据判断是否为NaN值的方法详解
2018/11/06 Python
python如何使用socketserver模块实现并发聊天
2019/12/14 Python
pandas数据处理之绘图的实现
2020/06/15 Python
CSS3 Pie工具推荐--让IE6-8支持一些优秀的CSS3特性
2014/09/02 HTML / CSS
params有什么用
2016/03/01 面试题
房地产销售员的自我评价分享
2013/12/04 职场文书
好家长事迹材料
2014/01/23 职场文书
激励员工的口号
2014/06/16 职场文书
党的群众路线教育实践活动领导班子整改方案
2014/10/25 职场文书
材料员岗位职责范本
2015/04/11 职场文书
Redis 配置文件重要属性的具体使用
2021/05/20 Redis