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 相关文章推荐
js几个不错的函数 $$()
Oct 09 Javascript
js变量作用域及可访问性的探讨
Nov 23 Javascript
JavaScript 联动的无限级封装类,数据采用非Ajax方式,随意添加联动
Jun 29 Javascript
jQuery学习笔记 操作jQuery对象 CSS处理
Sep 19 Javascript
js向上无缝滚动,网站公告效果 具体代码
Nov 18 Javascript
jquery中的过滤操作详细解析
Dec 02 Javascript
收集json解析的四种方法分享
Jan 17 Javascript
Vue单页面应用保证F5强刷不清空数据的解决方案
Jan 31 Javascript
jQuery实现文字超过1行、2行或规定的行数时自动加省略号的方法
Mar 28 jQuery
JS Ajax请求会话过期处理问题解决方法分析
Nov 16 Javascript
js实现3D粒子酷炫动态旋转特效
Sep 13 Javascript
如何实现vue的tree组件
Dec 03 Vue.js
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
PHP 防注入函数(格式化数据)
2011/08/08 PHP
基于PHP读取csv文件内容的详解
2013/06/18 PHP
PHP正则表达式过滤html标签属性(DEMO)
2016/05/04 PHP
LAMP环境使用Composer安装Laravel的方法
2017/03/25 PHP
PHP count()函数讲解
2019/02/03 PHP
PHP设计模式入门之状态模式原理与实现方法分析
2020/04/26 PHP
驱动事件的addEvent.js代码
2007/03/27 Javascript
javascript语言结构小记(一)
2011/09/10 Javascript
JS打开新窗口防止被浏览器阻止的方法
2015/01/03 Javascript
jQuery中parent()方法用法实例
2015/01/07 Javascript
javascript实现10个球随机运动、碰撞实例详解
2015/07/08 Javascript
jQuery实现ajax调用WCF服务的方法(附带demo下载)
2015/12/04 Javascript
js实现网页收藏功能
2015/12/17 Javascript
js获取Html元素的实际宽度高度的方法
2016/05/19 Javascript
JavaScript中Form表单技术汇总(推荐)
2016/06/26 Javascript
Bootstrap对话框使用实例讲解
2016/09/24 Javascript
BootStrap轮播HTML代码(推荐)
2016/12/10 Javascript
微信小程序 引用其他js文件实现代码
2017/02/22 Javascript
js 倒计时(高效率服务器时间同步)
2017/09/12 Javascript
关于Vue在ie10下空白页的debug小结
2018/05/02 Javascript
vue使用video插件vue-video-player详解
2020/10/23 Javascript
Python常用模块用法分析
2014/09/08 Python
Python最基本的数据类型以及对元组的介绍
2015/04/14 Python
Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
2015/05/22 Python
python之matplotlib学习绘制动态更新图实例代码
2018/01/23 Python
python3个性签名设计实现代码
2018/06/19 Python
Django使用中间键实现csrf认证详解
2019/07/22 Python
Python计算信息熵实例
2020/06/18 Python
django rest framework使用django-filter用法
2020/07/15 Python
Foreo国际站:Foreo International
2018/10/29 全球购物
德国滑雪和户外用品网上商店:XSPO
2019/10/30 全球购物
中小学生学籍证明
2014/10/25 职场文书
年终工作总结范文
2019/06/20 职场文书
php字符串倒叙
2021/04/01 PHP
解决numpy数组互换两行及赋值的问题
2021/04/17 Python
Java8利用Stream对列表进行去除重复的方法详解
2022/04/14 Java/Android