JavaScript作用域示例详解


Posted in Javascript onJuly 07, 2016

作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理。今天这篇文章对JavaScript作用域示例详解的介绍,希望能帮助大家更好的学习JavaScript。

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

一、JavaScript中无块级作用域

在Java或C#中存在块级作用域,即:大括号也是一个作用域。

public static void main ()
{
if(1==1){
String name = "seven";
}
System.out.println(name);
}
// 报错 
public static void Main()
{
if(1==1){
string name = "seven";
}
Console.WriteLine(name);
}
// 报错

在JavaScript语言中无块级作用域

function Main(){
if(1==1){
var name = 'seven';
}
console.log(name);
}
// 输出: seven

二、JavaScript采用函数作用域

在JavaScript中每个函数作为一个作用域,在外部无法访问内部作用域中的变量。

function Main(){
var innerValue = 'seven';
}
Main();
console.log(innerValue);
// 报错:Uncaught ReferenceError: innerValue is not defined

三、JavaScript的作用域链

由于JavaScript中的每个函数作为一个作用域,如果出现函数嵌套函数,则就会出现作用域链。

xo = 'alex';
function Func(){
var xo = "seven";
function inner(){
var xo = 'alvin'; 
console.log(xo);
}
inner();
}
Func();

如上述代码则出现三个作用域组成的作用域链,如果出现作用域链后,那么寻找变量时候就会出现顺序,对于上述实例:

当执行console.log(xo)时,其寻找顺序为根据作用域链从内到外的优先级寻找,如果内层没有就逐步向上找,直到没找到抛出异常。

四、JavaScript的作用域链执行前已创建

JavaScript的作用域在被执行之前已经创建,日后再去执行时只需要按照作用域链去寻找即可。

示例一:

xo = 'alex';
function Func(){
var xo = "seven";
function inner(){
console.log(xo);
}
return inner;
}
var ret = Func();
ret();
// 输出结果: seven

上述代码,在函数被调用之前作用域链已经存在:

•全局作用域 -> Func函数作用域 -> inner函数作用域

当执行【ret();】时,由于其代指的是inner函数,此函数的作用域链在执行之前已经被定义为:全局作用域 -> Func函数作用域 -> inner函数作用域,所以,在执行【ret();】时,会根据已经存在的作用域链去寻找变量。

示例二:

xo = 'alex';
function Func(){
var xo = "eirc";
function inner(){
console.log(xo);
}
xo = 'seven';
return inner;
}
var ret = Func();
ret();
// 输出结果: seven

上述代码和示例一的目的相同,也是强调在函数被调用之前作用域链已经存在:

•全局作用域 -> Func函数作用域 -> inner函数作用域

不同的时,在执行【var ret = Func();】时,Func作用域中的xo变量的值已经由 “eric” 被重置为 “seven”,所以之后再执行【ret();】时,就只能找到“seven”。

示例三:

xo = 'alex';<br>
function Bar(){
console.log(xo);
}
function Func(){
var xo = "seven";
return Bar;
}
var ret = Func();
ret();
// 输出结果: alex

上述代码,在函数被执行之前已经创建了两条作用域链:

•全局作用域 -> Bar函数作用域

•全局作用域 -> Func函数作用域

当执行【ret();】时,ret代指的Bar函数,而Bar函数的作用域链已经存在:全局作用域 -> Bar函数作用域,所以,执行时会根据已经存在的作用域链去寻找。

五、声明提前

在JavaScript中如果不创建变量,直接去使用,则报错:

console.log(xxoo);
// 报错:Uncaught ReferenceError: xxoo is not defined

JavaScript中如果创建值而不赋值,则该值为 undefined,如:

var xxoo;
console.log(xxoo);
// 输出:undefined

在函数内如果这么写:

function Foo(){
console.log(xo);
var xo = 'seven';
}
Foo();
// 输出:undefined

上述代码,不报错而是输出 undefined,其原因是:JavaScript的函数在被执行之前,会将其中的变量全部声明,而不赋值。所以,相当于上述实例中,函数在“预编译”时,已经执行了var xo;所以上述代码中输出的是undefined。

以上所述是小编给大家介绍的JavaScript作用域示例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
getAsDataURL在Firefox7.0下无法预览本地图片的解决方法
Nov 15 Javascript
JS数组操作(数组增加、删除、翻转、转字符串、取索引、截取(切片)slice、剪接splice、数组合并)
May 20 Javascript
微信小程序 POST请求(网络请求)详解及实例代码
Nov 16 Javascript
Vue中使用方法、计算属性或观察者的方法实例详解
Oct 31 Javascript
javascript实现考勤日历功能
Nov 29 Javascript
30分钟精通React今年最劲爆的新特性——React Hooks
Mar 11 Javascript
微信小程序导航栏跟随滑动效果的实现代码
May 14 Javascript
一次让你了解全部JavaScript的作用域
Jun 24 Javascript
JavaScript键盘事件响应顺序详解
Sep 30 Javascript
vscode 配置vue+vetur+eslint+prettier自动格式化功能
Mar 23 Javascript
Javascript执行流程细节原理解析
May 14 Javascript
vue利用全局导航守卫作登录后跳转到未登录前指定页面的实例代码
May 19 Javascript
BootStrap 轮播插件(carousel)支持左右手势滑动的方法(三种)
Jul 07 #Javascript
Bootstrap学习系列之使用 Bootstrap Typeahead 组件实现百度下拉效果
Jul 07 #Javascript
BootStrap学习系列之Bootstrap Typeahead 组件实现百度下拉效果(续)
Jul 07 #Javascript
jQuery之简单的表单验证实例
Jul 07 #Javascript
jQuery on()方法绑定动态元素的点击事件无响应的解决办法
Jul 07 #Javascript
Bootstrap3使用typeahead插件实现自动补全功能
Jul 07 #Javascript
Node.js DES加密的简单实现
Jul 07 #Javascript
You might like
各种咖啡的英文名子是什么
2021/03/03 新手入门
解析php中array_merge与array+array的区别
2013/06/21 PHP
laravel通过a标签从视图向控制器实现传值
2019/10/15 PHP
js获取变量
2006/08/24 Javascript
JS 常用校验函数
2009/03/26 Javascript
jQuery滚动加载图片效果的实现
2013/03/06 Javascript
jquery实现标签上移、下移、置顶
2015/04/26 Javascript
基于JavaScript实现回到页面顶部动画代码
2016/05/24 Javascript
jQuery解析与处理服务器端返回xml格式数据的方法详解
2016/07/04 Javascript
URL的参数中有加号传值变为空格的问题(URL特殊字符)
2016/11/04 Javascript
Javascript中for循环语句的几种写法总结对比
2017/01/23 Javascript
js 两个日期比较相差多少天的实例
2017/10/19 Javascript
深入浅出理解JavaScript闭包的功能与用法
2018/08/01 Javascript
antd 表格列宽自适应方法以及错误处理操作
2020/10/27 Javascript
[02:36]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma 选手采访
2021/03/11 DOTA
python登录并爬取淘宝信息代码示例
2017/12/09 Python
Python用 KNN 进行验证码识别的实现方法
2018/02/06 Python
python 实现分页显示从es中获取的数据方法
2018/12/26 Python
Python日志无延迟实时写入的示例
2019/07/11 Python
python进阶之自定义可迭代的类
2019/08/20 Python
TensorFlow实现批量归一化操作的示例
2020/04/22 Python
Python应用实现处理excel数据过程解析
2020/06/19 Python
python中tkinter窗口位置\坐标\大小等实现示例
2020/07/09 Python
Oroton中国官网:澳洲知名奢侈配饰品牌
2017/03/26 全球购物
应届生财务管理求职信
2013/11/06 职场文书
中学生打架检讨书
2014/02/10 职场文书
艺术节主持词
2014/04/02 职场文书
法人授权委托书
2014/04/03 职场文书
差生评语大全
2014/05/04 职场文书
同学聚会策划方案
2014/06/06 职场文书
招商引资工作汇报材料
2014/10/28 职场文书
英文感谢信范文
2015/01/21 职场文书
安全生产培训心得体会
2016/01/18 职场文书
go mod 安装依赖 unkown revision问题的解决方案
2021/05/06 Golang
Anaconda配置各版本Pytorch的实现
2021/08/07 Python
CentOS MySql8 远程连接实战
2022/04/19 MySQL