变量作用域

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中作用域以及变量范围相关推荐

  1. 如何理解JS中作用域和作用域链

    1.背景介绍 任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期.在JavaScript中,变量的作用域有全局作用域和局部作用域两 ...

  2. 详解js中的闭包(closure)以及闭包的使用

    作用域链 我们知道在js中作用域分为全局作用域与局部作用域,作用域链的访问规则为从内到外,也就是说如果当前的作用域中没有该变量或者方法,则会在包含该作用域的外层作用域中,一层一层的向上找,直到wind ...

  3. JavaScript学习笔记——JS中的变量复制、参数传递和作用域链

    今天在看书的过程中,又发现了自己目前对Javascript存在的一个知识模糊点:JS的作用域链,所以就通过查资料看书对作用域链相关的内容进行了学习.今天学习笔记主要有这样几个关键字:变量.参数传递.执 ...

  4. uniapp 获取到js文件var一个变量怎么获取到这个变量值_浅析Js中const,let,var的区别及作用域...

    理解:let变量的作用域只能在当前函数中 js中const,let,var的区别及作用域_lianzhang861的博客-CSDN博客​blog.csdn.net 全局作用域中,用 const 和 l ...

  5. js变量提升_学习笔记:JS中的作用域和预解析

    知识总结:谢静贤.汤昊 在javascript中作用域是非常重要的,本文将会说明作用域以及我们在工作,以及面试中的一些面试题,如果有不足的地方希望大家可以评论指出来,自己一定会及时的改正错误,避免大家 ...

  6. js中变量作用域的小理解

    一:变量作用域 在js代码中每个变量都是有自己的作用域的,js中不像C语言有块级作用域的概念,取而代之的是函数作用域,看如下代码: var scope="global"; func ...

  7. 关于JS中for循环时,作用域问题和this指针指向的总结

    在大多数计算机语言中,{}这样一对花括弧叫一个块级作用域,也就是一个执行环境.在一个执行环境中,执行环境内部的变量在作用域外部式无法被访问到的.执行环境内部倒是可以访问外部的变量. 但由于JS中没有块 ...

  8. Js中的作用域和作用域链

    Js中的作用域和作用域链 前言 阅读本文,请先阅读:Js中的函数相关:创建函数的三种方式.函数的形参和实参.返回值.return.break.continue的区别.重载和arguments.匿名函数 ...

  9. 浅谈js中的var和function变量提升,var声明变量提升,块级作用域中的函数提升

    1.首先最常见的一种变量提升 console.log(a); //输出 undefinedvar a=10;console.log(a) // 输出 10 var 有提升的作用其实上面的代码会变成会变 ...

最新文章

  1. 人脸识别门禁_门禁人脸识别系统铜陵县门禁人脸识别系统哪家好
  2. 如何理解python的类与对象
  3. [2019BUAA软件工程]第1次阅读作业
  4. 理解OAuth 2.0--转
  5. 算符“.*”和“-*”,用于“成员指针”
  6. android桌面小组件开发_快使用Scriptable自己开发一个iPhone小组件吧
  7. ubuntu 没有php.ini,linux – 在Ubuntu中我对php.ini进行了更改,但没有任何反应
  8. python扩展文件_1. 使用 C 或 C++ 扩展 Python
  9. python 保存文件 吃内存_python检测空间储存剩余大小和指定文件夹内存占用的实例...
  10. 将Docker image push 到azure
  11. mysql的utf-8怎么用_记住:永远不要在MySQL中使用UTF-8
  12. 如何理解IPD+CMMI+Scrum一体化研发管理解决方案之IPD?
  13. iPone实现快速切换表情输入法?
  14. android11 前摄相头隐藏闪光灯图标
  15. 医学图像有哪些会议期刊可以投
  16. 「占星术杀人魔法」 读后感
  17. Chrome浏览器通过chrono下载插件设置下载断点续传
  18. Serval的试卷答案(线段树)
  19. Ubuntu20.04安装fcitx中文输入法(五笔拼音)
  20. SOLIDWORKS中钣金展开标注是英文怎么办?

热门文章

  1. 开始加入Bloger行列
  2. Scrapy框架实战(五):通用爬虫 CrawlSpider
  3. 对服装企业板房的设计管理及研究
  4. 初探Disruptor
  5. 计算机网络面向下一代,面向下一代互联网“计算机网络”课程教学改革论文
  6. 机械开关消抖方法汇总介绍
  7. Linux 磁带机备份完全攻略
  8. 最近闲话比较多了, 应该消停点~
  9. 【饭谈】为何要加入技术交流群?
  10. c语言程序设计电子信息,电子信息类专业C语言程序设计实践教学探讨