只需五句话搞定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 相关文章推荐
jQuery MD5加密实现代码
Mar 15 Javascript
随鼠标移动的时钟非常漂亮遗憾的是只支持IE
Aug 12 Javascript
jQuery中;function($,undefined) 前面的分号的用处
Dec 17 Javascript
JavaScript中定义函数的三种方法
Mar 12 Javascript
JQuery datepicker 用法详解
Dec 25 Javascript
简易的JS计算器实现代码
Oct 18 Javascript
微信小程序图表插件(wx-charts)实例代码
Jan 17 Javascript
原生js和css实现图片轮播效果
Feb 07 Javascript
JavaScript hasOwnProperty() 函数实例详解
Aug 04 Javascript
vue底部加载更多的实例代码
Jun 29 Javascript
详解Vue.js在页面加载时执行某个方法
Nov 20 Javascript
js实现简单图片拖拽效果
Feb 22 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
PHP+MySQL 手工注入语句大全 推荐
2009/10/30 PHP
基于php冒泡排序算法的深入理解
2013/06/09 PHP
PHP ajax+jQuery 实现批量删除功能实例代码小结
2018/12/06 PHP
PHP简单实现图片格式转换(jpg转png,gif转png等)
2019/10/30 PHP
php利用ZipArchive类操作文件的实例
2020/01/21 PHP
简单时间提示DEMO从0开始一直进行计时
2013/11/19 Javascript
jQuery弹出层插件Lightbox_me使用指南
2015/04/21 Javascript
js获取浏览器的各种属性
2017/04/27 Javascript
jQuery实现滑动星星评分效果(每日分享)
2019/11/13 jQuery
vue实现element表格里表头信息提示功能(推荐)
2019/11/20 Javascript
jQuery插件实现图片轮播效果
2020/10/19 jQuery
Python实现windows下模拟按键和鼠标点击的方法
2015/03/13 Python
基于python实现微信模板消息
2015/12/21 Python
python去除空格和换行符的实现方法(推荐)
2017/01/04 Python
python 接收处理外带的参数方法
2018/12/03 Python
python变量赋值方法(可变与不可变)
2019/01/12 Python
Python中filter与lambda的结合使用详解
2019/12/24 Python
Python使用多进程运行含有任意个参数的函数
2020/05/02 Python
使用pytorch 筛选出一定范围的值
2020/06/28 Python
ivx平台开发之不用代码实现一个九宫格抽奖功能
2021/01/27 HTML / CSS
英国翻新电子产品购物网站:Tech Trade
2017/12/25 全球购物
英国最大的海报商店:GB Posters
2018/03/20 全球购物
Bose美国官网:购买Bose耳机和音箱
2019/03/10 全球购物
Hawes & Curtis官网:英国经典品牌
2019/07/27 全球购物
Marlies Dekkers内衣荷兰官方网店:荷兰奢侈内衣品牌
2020/03/27 全球购物
毕业生的自我评价
2013/12/30 职场文书
绿色环保演讲稿
2014/05/10 职场文书
2014年学校领导班子对照检查材料
2014/09/19 职场文书
中学生自我评价范文
2015/03/03 职场文书
职称评定个人总结
2015/03/05 职场文书
创建文明城市倡议书
2015/04/28 职场文书
Golang二维切片初始化的实现
2021/04/08 Golang
浅谈Python类的单继承相关知识
2021/05/12 Python
Mysql数据库值的添加、修改、删除及清空操作实例
2021/06/20 MySQL
15个值得收藏的JavaScript函数
2021/09/15 Javascript
使用HBuilder制作一个简单的HTML5网页
2022/07/07 HTML / CSS