词法作用域
来源:互联网 发布:网络多媒体新闻 编辑:程序博客网 时间:2024/04/30 00:56
作用域
域表示的就是 范围, 即 作用范围. 就是一个名字在什么地方可以被使用, 什么时候不能使用.
块级作用域
即块级别的作用范围
// 在 C , Java 等编程语言中, 下面的语法报错 { var num = 123; // int { console.log( num ); // => 123 } } console.log( num ); // 报错
在 js 中采用词法作用域
所谓的 词法( 代码 )作用域, 就是代码在编写过程中体现出来的作用范围. 代码一旦写好, 不用执行,
作用范围就已经确定好了. 这个就是所谓词法作用域.
在 js 中词法作用域规则:
- 函数允许访问函数外的数据.
- 整个代码结构中只有函数可以限定作用域.
- 作用规则首先使用提升规则分析
- 如果当前作用规则中有名字了, 就不考虑外面的名字
作用域链
可以发现只有函数可以制造作用域结构. 那么只要是代码, 至少有一个作用域, 即全局作用域.
凡是代码中有函数, 那么这个函数就构成另一个作用域. 如果函数中还有函数, 那么再这个作用域中就
又可以诞生一个作用域. 那么将这样的所有的作用域列出来, 可以有一个结构: 函数内指向函数外的链式结构.
绘制作用域链的步骤:
- 看整个全局是一条链, 即顶级链, 记为 0 级链
- 看全局作用域中, 有什么成员声明, 就以方格的形式绘制到 0 级练上
- 再找函数, 只有函数可以限制作用域, 因此从函数中引入新链, 标记为 1 级链
- 然后在每一个 1 级链中再次往复刚才的行为
变量的访问规则
- 首先看变量在第几条链上, 在该链上看是否有变量的定义与赋值, 如果有直接使用
- 如果没有到上一级链上找( n - 1 级链 ), 如果有直接用, 停止继续查找.
- 如果还没有再次往上刚找... 直到全局链( 0 级 ), 还没有就是 is not defined
- 注意, 切记 同级的链不可混合查找
如何分析代码
- 在分析代码的时候切记从代码的运行进度上来分析, 如果代码给变量赋值了, 一定要标记到图中
- 如果代码比较复杂, 可以在图中描述代码的内容, 有事甚至需要将原型图与作用域图合并分析
var num = 123; function f1() { console.log( num ); } function f2() { var num = 456; f1(); } f2();
var num = 123; function f1() { console.log( num ); } function f2() { num = 456; f1(); } f2();
补充
- 声明变量使用 var, 如果不使用 var 声明的变量就是全局变量( 禁用 )
- 因为在任何代码结构中都可以使用该语法. 那么在代码维护的时候会有问题. 所以除非特殊原因不要这么用.
下面的代码的错误
function foo () { var i1 = 1 // 局部 i2 = 2, // 全局 i3 = 3; // 全局}
此时注意
var arr = [];for ( var i = 0; i < 10; i++ ) { arr.push( i );}for ( var i = 0; i < 10; i++ ) { console.log( arr[ i ] );}// 一般都是将变量的声明全部放到开始的位置, 避免出现因为提升而造成的错误var arr = [], i = 0;for ( i=0; i < 10; i++ ) { arr.push( i );}for ( i = 0; i < 10; i++ ) { console.log( arr[ i ] );}
0 0
- Javascript词法作用域
- Javascript 词法作用域
- JS词法作用域
- 再谈闭包-词法作用域
- 词法作用域
- 词法作用域
- 词法作用域
- JavaScript 词法作用域
- 词法作用域
- 词法作用域
- JavaScript-词法作用域
- 词法作用域之欺骗词法
- JavaScript的词法作用域
- js词法分析 作用域
- 词法闭包+作用域
- 词法作用域(!!!重点)
- JavaScript笔记:词法作用域
- javascript的词法作用域
- 21.PLSQL中的变量声明
- Java 及Tomcat7.0.22在Windows下详细配置过程
- RTMP规范简单分析
- MD5加密
- 杂项
- 词法作用域
- Unity 5 中的全局光照技术详解
- Eclipse中添加Shell脚本(如start.sh)
- linux 基础学习之权限管理命令
- An adaptive weighting parameter selection for improved integrated active contour model
- Android开发 Resources$NotFoundException: File res/drawable/abc_vector_test.xml from xml
- js通过name直接访问目标文档对象
- js限制输入框只能输入数字、负数和小数点
- Git