javascript函数作用域链之词法作用域
在开发语言中常见的作用域规则有 块级作用域和词法作用域
作用域 顾名思义就是起作用的区域 定义一变量后 ,可以在此范围作用的区域
一、块级作用域就是用一个块结构分割变量的访问区域 块即{ } 代表语言有C 系列语言
二、词法作用域就是变量的作用范围,简言之词法作用域与代码的编写有关于执行无关,函数内部允许访问函数外部的变量
特点:分割作用域只有函数
变量名提升
函数名提升
函数的声明比变量的声明优先级高
function a(){
}
var a;
alert(a);//打印出a的函数体 var a;
function a(){
}
alert(a);//打印出a的函数体 //但是要注意区分和下面两个写法的区别:
var a=1;
function a(){
}
alert(a);//打印出1 <script>
function a(){
}
var a=1;
alert(a);//打印出1
function test() { bar(); // 2
var foo = function () { // 变量指向函数表达式
console.log("1");
}
function bar() { // 函数声明 函数名为bar
console.log("2");
}
foo();//
}
test(); 但是
function test() {
foo();//报错
bar();
var foo = function () { // 变量指向函数表达式
console.log("1");
}
function bar() { // 函数声明 函数名为bar
console.log("2");
} }
test();
结论
1、声明会提升
2、 只有函数才会限定作用域
绘制作用域链规则
1> 将全部的 script 标签看做一个整体. 是一个 0 级别的链
链中所有的全局范围内的变量, 函数, 对象... 都是链中的成员
由于声明会提升, 因此在绘制链之前将代码可以进行调整, 在开始的时候
将声明都写在前面, 绘图的时候按照顺序绘制, 较为简单.
2> 由于只有函数才可以限定作用域. 因此在函数上引出一条新链, 级别为 n + 1
在函数内部, 又是一个完整, 独立的作用域结构
因此在函数内部定义的任何成员也按照 1> 中的规则在该链上展开
3> 如果有函数, 继续绘制下去
变量搜索原则
在代码的运行过程中, 如果访问某一个变量
那么首先在当前链上找 ( 无序 ), 如果没有, 在 n-1 级上找
( 在函数内部允许访问定义在函数外部的变量 )
如此往复, 直到 0 级链, 如果还没有 抛出异常
如果找到, 则结束寻找, 直接获得该链上变量的数据
javascript函数作用域链之词法作用域的更多相关文章
- [label][JavaScript]读nowmagic - js词法作用域、调用对象与闭包
原文链接: http://www.nowamagic.net/librarys/veda/detail/1305 作用域(scope) JavaScript 中的函数 ...
- 【作用域】词法作用域(静态作用域,如:js)、动态作用域(如:.bash脚本)
作用域 作用域是指程序源代码中定义变量的区域. 作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限. JavaScript 采用词法作用域(lexical scoping),也就是静态作 ...
- Javascript中的词法作用域、动态作用域、函数作用域和块作用域(四)
一.js中的词法作用域和动态作用域 词法作用域也就是在词法阶段定义的作用域,也就是说词法作用域在代码书写时就已经确定了. js中其实只有词法作用域,并没有动态作用域,this的执 ...
- 你不知道的Javascript(上卷)读书笔记之二 ---- 词法作用域
在前一篇文章中,我们把作用域定义为"管理.维护变量的一套规则",接下来是时候来深入讨论一下Js的作用域问题了,首先我们要知道作用域一般有两种主要的工作类型,一种是词法作用域,一种是 ...
- 深入理解javascript作用域系列第二篇——词法作用域和动态作用域
× 目录 [1]词法 [2]动态 前面的话 大多数时候,我们对作用域产生混乱的主要原因是分不清楚应该按照函数位置的嵌套顺序,还是按照函数的调用顺序进行变量查找.再加上this机制的干扰,使得变量查找极 ...
- 读书时间《JavaScript高级程序设计》三:函数,闭包,作用域
上一次看了第6章,面向对象.这里接着看第7章. 第7章:函数表达式 定义函数有两种方式:函数声明.函数表达式 //函数声明 function functionName(arg0,arg1,arg2){ ...
- JavaScript夯实基础系列(一):词法作用域
作用域是一组规则,规定了引擎如何通过标识符名称来查询一个变量.作用域模型有两种:词法作用域和动态作用域.词法作用域是在编写时就已经确定的:通过阅读包含变量定义的数行源码就能知道变量的作用域.Jav ...
- JavaScript深入之词法作用域和动态作用域
作用域 作用域是指程序源代码中定义变量的区域. 作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限. JavaScript 采用词法作用域,也就是静态作用域. 静态作用域与动态作用域 因 ...
- JavaScript词法作用域与调用对象
关于 Javascript 的函数作用域.调用对象和闭包之间的关系很微妙,关于它们的文章已经有很多,但不知道为什么很多新手都难以理解.我就尝试用比较通俗的语言来表达我自己的理解吧. 作用域 Scope ...
随机推荐
- python----设置默认编码
问题:python的默认编码是ascii.在处理中文的时候可能会出现乱码的情况:这个时候我们就需要把编码设置为对应的编码了. 解决方案: 对python文件的头部做如下修改 import sys re ...
- C#的线程池的那些事
最近在做站时发现,线程池的问题很棘手,所以总结了一篇关于线程池的文章,原文地址:http://www.shuonar.com/blog/ac16496b-87ec-4790-a9ea-d69bbffa ...
- Android扫描SD卡中的文件
当android的系统启动的时候,系统会自动扫描sdcard内的多媒体文件,并把获得的信息保存在一个系统数据库中,以后在其他程序中如果想要访问多媒体文件的信息,其实就是在这个数据库中进行的,而不是直接 ...
- HTML 5 drag and drop 简介
Html 5 drag and drop 简介 HTML5提供了专门拖拽和拖放的API draggable属性 启用拖拽 draggable属性是否可被拖拽, 可选值: true, false, au ...
- 04737_C++程序设计_第8章_多态性和虚函数
例8.1 分析下面程序的输出结果. 例8.2 分别使用指针和引用的display函数. #include <iostream> using namespace std; const dou ...
- 设计模式- 主动对象(Active Object)
译者注:1.对象分为主动对象和被动对象,主动对象内部包含一个线程,可以自动完成动作或改变状态,而一般的被动对象只能通过被其他对象调用才有所作为.在多线程程序中,经常把一个线程封装到主动对象里面.2.在 ...
- Excel文件转换为html静态网页
Excel文件转换为html静态网页:右键另存为:
- PLSQL连接Oracle数据库,使用instantclient_10_2客户端
使用instantclient_10_2作为PLSQL客户端配置步骤如下:1.将instantclient_10_2文件夹copy到PLSQL的安装目录下(如D:\Program Files\PLSQ ...
- Oracle 导入本地dmp文件 详细操作步骤
以下操作均在命令行窗口中进行 /*连接数据库*/ C:\Users\hqbhonker>sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Prod ...
- 微型 ORM 的第二篇 DapperLambda性能测试[Dapper比较篇]
由于这周比较忙,所以本来想做的性能测试,一直没时间,想想还是今天给补上吧 由于很多人都担心性能问题,封装之后跟Dapper的性能差距是多少,今天我给出我的测试方法,仅供参考. 创建IDbConnect ...