只需五句话搞定JavaScript作用域(经典)


Posted in Javascript onJuly 26, 2016

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)时,其寻找顺序为根据作用域链从内到外的优先级寻找,如果内层没有就逐步向上找,直到没找到抛出异常。

425762-20160707114743577-37359182.png

四、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';
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 相关文章推荐
javascript 流畅动画实现原理
Sep 08 Javascript
AJAX使用了UpdatePanel后无法使用alert弹出脚本
Apr 02 Javascript
javascript下高性能字符串连接StringBuffer类
Aug 16 Javascript
JS获取鼠标坐标的实例方法
Jul 18 Javascript
js+jquery常用知识点汇总
Mar 03 Javascript
小巧强大的jquery layer弹窗弹层插件
Dec 06 Javascript
关于数据与后端进行交流匹配(点亮星星)
Aug 03 Javascript
jQuery鼠标事件总结
Oct 13 Javascript
浅谈Angular 的变化检测的方法
Mar 01 Javascript
layerui代码控制tab选项卡,添加,关闭的实例
Sep 04 Javascript
Vue Cli3 打包配置并自动忽略console.log语句的方法
Apr 23 Javascript
基于element-ui对话框el-dialog初始化的校验问题解决
Sep 11 Javascript
第一次接触神奇的Bootstrap基础排版
Jul 26 #Javascript
js获取html的span标签的值方法(超简单)
Jul 26 #Javascript
js无法获取到html标签的属性的解决方法
Jul 26 #Javascript
jquery判断对象是否为空并遍历对象的简单实例
Jul 26 #Javascript
浅谈Javascript数据属性与访问器属性
Jul 26 #Javascript
js判断空对象的实例(超简单)
Jul 26 #Javascript
全面了解构造函数继承关键apply call
Jul 26 #Javascript
You might like
Zend Framework实现留言本分页功能(附demo源码下载)
2016/03/22 PHP
php下载远程大文件(获取远程文件大小)的实例
2017/06/17 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
2018/06/16 PHP
给Javascript数组插入一条记录的代码
2007/08/30 Javascript
IE中radio 或checkbox的checked属性初始状态下不能选中显示问题
2009/07/25 Javascript
页面实时更新时间的JS实例代码
2013/12/18 Javascript
js中split函数的使用方法说明
2013/12/26 Javascript
js实现身份证号码验证的简单实例
2014/02/19 Javascript
js读取json的两种常用方法示例介绍
2014/10/19 Javascript
angularJS中router的使用指南
2015/02/09 Javascript
在JS方法中返回多个值的方法汇总
2015/05/20 Javascript
JS获取鼠标选中的文字
2016/08/10 Javascript
jQuery 常见小例汇总
2016/12/14 Javascript
jQuery实现复制到粘贴板功能
2017/02/11 Javascript
JavaScript实现选项卡效果的分析及步骤
2019/04/16 Javascript
使用 webpack 插件自动生成 vue 路由文件的方法
2019/08/20 Javascript
javascript设计模式 ? 建造者模式原理与应用实例分析
2020/04/10 Javascript
详解datagrid使用方法(重要)
2020/11/06 Javascript
python切片及sys.argv[]用法详解
2018/05/25 Python
完美解决安装完tensorflow后pip无法使用的问题
2018/06/11 Python
python的一些加密方法及python 加密模块
2019/07/11 Python
python字典的常用方法总结
2019/07/31 Python
pytorch 实现模型不同层设置不同的学习率方式
2020/01/06 Python
Ben Sherman官方网站:英国男装品牌
2019/10/22 全球购物
生态学毕业生自荐信
2013/10/27 职场文书
电气专业推荐信范文
2013/11/18 职场文书
英语简历自我评价
2014/01/26 职场文书
《狼》教学反思
2014/03/02 职场文书
学习型班组申报材料
2014/05/31 职场文书
2014年教师政治学习材料
2014/06/02 职场文书
商务经理岗位职责
2014/08/03 职场文书
奖励申请报告范文
2015/05/15 职场文书
python绘制箱型图
2021/04/27 Python
JavaScript 反射学习技巧
2021/10/16 Javascript
angular异步验证器防抖实例详解
2022/03/31 Javascript
SQL Server使用导出向导功能
2022/04/08 SQL Server