本文实例讲述了JavaScript词法作用域与作用域链。分享给大家供大家参考,具体如下:
域表示的就是范围,即作用域,就是一个名字在什么地方可以使用,什么时候不能使用。想了解更多关于作用域的问题推荐阅读《你不知道的JavaScript上卷》第一章(或第一部分),从编译原理的角度说明什么是作用域。概括的说作用域就是一套设计良好的规则来存储变量,并且之后可以方便地找到这些变量。
在C、Java、C#等编程语言中,下面的语法报错(伪代码)
{ var num = 123; { console.log( num ); // num => 123 } } console.log( num ); //报错
所谓的词法(代码)作用域,就是代码在编写过程中体现出来的作用范围,代码一旦写好,不用执行,作用范围就已经确定好了,这个就是所谓的词法作用域。
在JS中词法作用域的规则:
例子1:
var num = 123; function foo(){ console.log( num ); } foo(); //123
例子2:
if( false ){ var num = 123; } console.log( num ); //undefined
例子3:
var num = 123; function foo () { var num = 456; function func(){ console.log( num ); } func(); } foo(); //456
只有函数才能制造作用域结构,那么只要是代码,至少有一个作用域,即全局作用域。
凡是代码中有函数,那么这个函数就构成另一个作用域。如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域,那么将这样的所有作用域列出来,可以有一个结构:函数内指向函数外的链式结构
例如:
function f1() { function f2() { } } var num = 456; function f3() { function f4() { } }
作用域链结构与DOM树结构很相似.
步骤:
绘制如下程序的作用域链
function f1() { var num = 123; function f2() { console.log( num ); } f2(); } var num = 456; f1(); //123
函数f1 和变量 num=456, 在0级链,而f1下又可以展开1级链,1级链上有num=123和函数f2。程序f1()调用进入左边1级链,而f1中又调用了f2函数,f2函数中console.log(num)可以看作在2级链,此时,程序会向这一条链向上查找,首先2级链没有num,向上到达1级链,刚好1级链上有num=123,所以就直接使用123,程序最后的结果就是打印123.
分析如下代码:
var num = 123; function f1() { console.log( num ); } function f2(){ var num = 456; f1(); } f2(); //123
作用域链图:
首先把num=123,函数f1,函数f2画在0级链上。f1中只有一句console,画出一条1级链,f2也下画出1级链,链上有num=456和函数调用语句f1();
调用f2(),进入f2函数的作用域链,而在f2中又调用了f1函数,程序进入f1的作用域链,所以console.log(num)会在此链上查找是否存在num,没有,继续向上一级链查找,刚好在0级链上找到了num=123,所以f1函数中的console.log(num)就是123.
感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.jb51.net/code/HtmlJsRun测试上述代码运行效果。
更多关于JavaScript相关内容可查看本站专题:《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。
本文向大家介绍JavaScript闭包与作用域链实例分析,包括了JavaScript闭包与作用域链实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript闭包与作用域链。分享给大家供大家参考,具体如下: 闭包定义 闭包指的是有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数A内部创建另一个函数B,那么函数B就是一个闭包,可以访问函数A作用域中的所
本文向大家介绍JavaScript作用域链示例分享,包括了JavaScript作用域链示例分享的使用技巧和注意事项,需要的朋友参考一下 JavaScript只有函数作用域;每个函数都有个作用域链直达window对象。 变量的查找由内而外层层查找,找到即止。 同时不仅可以查找使用,甚至可以改变外部变量。
本文向大家介绍JavaScript作用域链实例详解,包括了JavaScript作用域链实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript作用域链。分享给大家供大家参考,具体如下: 跟其他语言一样,变量和函数的作用域揭示了这些变量和函数的搜索路径。对于JavaScript而言,理解作用域更加重要,因为在JavaScript中,作用域可以用来确定this的值,并且Ja
本文向大家介绍javascript作用域链(Scope Chain)用法实例解析,包括了javascript作用域链(Scope Chain)用法实例解析的使用技巧和注意事项,需要的朋友参考一下 本文实例分析了javascript作用域链(Scope Chain)用法。分享给大家供大家参考,具体如下: 关于js的作用域链,早有耳闻,也曾看过几篇介绍性的博文,但一直都理解的模棱两可。近日又精心翻看了
作用域个数 = n(定义的函数个数) + 1(全局作用域) JavaScript函数高级——作用域与作用域链 一、作用域 (1)理解 就是一块"地盘", 一个代码段所在的区域。 它是静态的(相对于上下文对象), 在编写代码时就确定了。 (2)分类 全局作用域 函数作用域 ES6中新增了块级作用域 (3)作用 隔离变量,不同作用域下同名变量不会有冲突。 二、作用域与执行上下文 (1)区别1 全局作用
本文向大家介绍JS 作用域与作用域链详解,包括了JS 作用域与作用域链详解的使用技巧和注意事项,需要的朋友参考一下 (1)作用域 一个变量的作用域(scope)是程序源代码中定义的这个变量的区域。 1. 在JS中使用的是词法作用域(lexical scope) 不在任何函数内声明的变量(函数内省略var的也算全局)称作全局变量(global scope) 在函数内声明的变量具有函数作用域(func