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下获取div中的数据的原理分析
Apr 07 Javascript
html中table数据排序的js代码
Aug 09 Javascript
简介JavaScript中的getSeconds()方法的使用
Jun 10 Javascript
JavaScript知识点总结(十)之this关键字
May 31 Javascript
Bootstrap基本组件学习笔记之按钮组(8)
Dec 07 Javascript
JavaScript仿支付宝6位数字密码输入框
Dec 29 Javascript
Node.js对MongoDB数据库实现模糊查询的方法
May 03 Javascript
JavaScript运动框架 解决速度正负取整问题(一)
May 17 Javascript
Bootstrap4如何定制自己的颜色和风格
Feb 26 Javascript
vue将毫秒数转化为正常日期格式的实例
Sep 16 Javascript
vue 属性拦截实现双向绑定的实例代码
Oct 24 Javascript
Vue自定义组件的四种方式示例详解
Feb 28 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
ajax缓存问题解决途径
2006/12/06 PHP
删除及到期域名的查看(抢域名必备哦)
2008/05/14 PHP
php学习之简单计算器实现代码
2011/06/09 PHP
PHP文件上传判断file是否己选择上传文件的方法
2014/11/10 PHP
php防止用户重复提交表单
2015/11/02 PHP
PHP抽象类基本用法示例
2018/12/28 PHP
javascript 读取xml,写入xml 实现代码
2009/07/10 Javascript
通过Jscript中@cc_on 语句识别IE浏览器及版本的代码
2011/05/07 Javascript
使用jquery实现图文切换效果另加特效
2013/01/20 Javascript
关于JS判断图片是否加载完成且获取图片宽度的方法
2013/04/09 Javascript
使用JavaScript 实现各种跨域的方法
2013/05/08 Javascript
js左侧三级菜单导航实例代码
2013/09/13 Javascript
jquery 获取select数组与name数组长度的实现代码
2016/06/20 Javascript
Node.js中的http请求客户端示例(request client)
2017/05/04 Javascript
JS实现简单省市二级联动
2019/11/27 Javascript
JavaScript禁止右击保存图片,禁止拖拽图片的实现代码
2020/04/28 Javascript
快速了解Vue父子组件传值以及父调子方法、子调父方法
2020/07/15 Javascript
小程序实现简单语音聊天的示例代码
2020/07/24 Javascript
python-docx修改已存在的Word文档的表格的字体格式方法
2018/05/08 Python
matplotlib给子图添加图例的方法
2018/08/03 Python
python的命名规则知识点总结
2019/10/04 Python
Python 装饰器原理、定义与用法详解
2019/12/07 Python
python垃圾回收机制(GC)原理解析
2019/12/30 Python
python脚本监控logstash进程并邮件告警实例
2020/04/28 Python
Django多层嵌套ManyToMany字段ORM操作详解
2020/05/19 Python
台湾深度自由行旅游平台:Tripbaa趣吧
2017/10/10 全球购物
澳大利亚现代波西米亚风格女装网站:Bohemian Traders
2018/04/16 全球购物
澳大利亚快时尚鞋类市场:Billini
2018/05/20 全球购物
下述程序的作用是计算机数组中的最大元素值及其下标
2012/11/26 面试题
《春笋》教学反思
2014/04/15 职场文书
低碳环保口号
2014/06/12 职场文书
校长师德师风自我剖析材料
2014/09/29 职场文书
开业庆典致辞
2015/08/01 职场文书
PHP对接阿里云虚拟号的实现(号码隐私保护)
2021/04/06 PHP
Html5获取用户当前位置的几种方式
2022/01/18 HTML / CSS
Redis基本数据类型Zset有序集合常用操作
2022/06/01 Redis