在开发语言中常见的作用域规则有  块级作用域和词法作用域

作用域 顾名思义就是起作用的区域  定义一变量后 ,可以在此范围作用的区域

一、块级作用域就是用一个块结构分割变量的访问区域  块即{ } 代表语言有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函数作用域链之词法作用域的更多相关文章

  1. [label][JavaScript]读nowmagic - js词法作用域、调用对象与闭包

     原文链接:                 http://www.nowamagic.net/librarys/veda/detail/1305 作用域(scope) JavaScript 中的函数 ...

  2. 【作用域】词法作用域(静态作用域,如:js)、动态作用域(如:.bash脚本)

    作用域 作用域是指程序源代码中定义变量的区域. 作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限. JavaScript 采用词法作用域(lexical scoping),也就是静态作 ...

  3. Javascript中的词法作用域、动态作用域、函数作用域和块作用域(四)

    一.js中的词法作用域和动态作用域      词法作用域也就是在词法阶段定义的作用域,也就是说词法作用域在代码书写时就已经确定了.       js中其实只有词法作用域,并没有动态作用域,this的执 ...

  4. 你不知道的Javascript(上卷)读书笔记之二 ---- 词法作用域

    在前一篇文章中,我们把作用域定义为"管理.维护变量的一套规则",接下来是时候来深入讨论一下Js的作用域问题了,首先我们要知道作用域一般有两种主要的工作类型,一种是词法作用域,一种是 ...

  5. 深入理解javascript作用域系列第二篇——词法作用域和动态作用域

    × 目录 [1]词法 [2]动态 前面的话 大多数时候,我们对作用域产生混乱的主要原因是分不清楚应该按照函数位置的嵌套顺序,还是按照函数的调用顺序进行变量查找.再加上this机制的干扰,使得变量查找极 ...

  6. 读书时间《JavaScript高级程序设计》三:函数,闭包,作用域

    上一次看了第6章,面向对象.这里接着看第7章. 第7章:函数表达式 定义函数有两种方式:函数声明.函数表达式 //函数声明 function functionName(arg0,arg1,arg2){ ...

  7. JavaScript夯实基础系列(一):词法作用域

      作用域是一组规则,规定了引擎如何通过标识符名称来查询一个变量.作用域模型有两种:词法作用域和动态作用域.词法作用域是在编写时就已经确定的:通过阅读包含变量定义的数行源码就能知道变量的作用域.Jav ...

  8. JavaScript深入之词法作用域和动态作用域

    作用域 作用域是指程序源代码中定义变量的区域. 作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限. JavaScript 采用词法作用域,也就是静态作用域. 静态作用域与动态作用域 因 ...

  9. JavaScript词法作用域与调用对象

    关于 Javascript 的函数作用域.调用对象和闭包之间的关系很微妙,关于它们的文章已经有很多,但不知道为什么很多新手都难以理解.我就尝试用比较通俗的语言来表达我自己的理解吧. 作用域 Scope ...

随机推荐

  1. 通过Orchard认识的Autofac

    反射Reflection 这是.Net中获取运行时类型信息的方式,.Net的应用程序由几个部分:'程序集(Assembly)'.'模块(Module)'.'类型(class)'组成,而反射提供一种编程 ...

  2. 剑指offer——已知二叉树的先序和中序排列,重构二叉树

    这是剑指offer中关于二叉树重构的一道题.题目原型为: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2, ...

  3. Delphi 函数指针(三大好处:灵活,委托的本质,回调机制),还可把函数指针当参数传入

    首先学习: 指向非对象(一般的)函数/过程的函数指针 Pascal 中的过程类型与C语言中的函数指针相似,为了统一说法,以下称函数指针.函数指针的声明只需要参数列表:如果是函数,再加个返回值.例如声明 ...

  4. 圣何塞与 Microsoft 宣布该市为超过 5,000 名市府公务员选择 Office 365、Windows Azure 和 StorSimple

    过去几个月来我们展示了极大的客户吸引力,今天我们非常高兴地宣布,我们又赢得了一位新客户,且他们利用 Microsoft 革新 IT 的方式非常有趣. 今天,我们非常高兴地告诉大家,圣何塞市选择了 Mi ...

  5. 比较两个data日期之间的天数相差

    先将字符串转化为Date类型 转化方式参看:http://blog.csdn.net/caoyinghui1986/archive/2008/04/18/2303570.aspx 然后在调用Date. ...

  6. 最终有SpringMvc与Struts2的对照啦

    眼下企业中使用SpringMvc的比例已经远远超过Struts2,那么两者究竟有什么差别,是非常多刚開始学习的人比較关注的问题,以下我们就来对SpringMvc和Struts2进行各方面的比較: 1. ...

  7. ObjectiveC中的block用法解析

    Block Apple 在C, Objective-C,C++加上Block这个延申用法.目前只有Mac 10.6 和iOS 4有支持.Block是由一堆可执行的程序组成,也可以称做没有名字的Func ...

  8. 教你爱上Blocks(闭包)

    传值 Blocks是C语言的扩充功能:带有自动变量(局部变量)的匿名函数.通过Blocks,源代码中就能使用匿名函数,即不带名称的函数.在我们 的工作中,命名占据了很大一部分,函数名,变量名,属性名, ...

  9. JavaScrtip之JS最佳实践

    一.JavaScript之平稳退化 这边使用一个当用户点击某个页面内某个链接弹出一个新窗口的案例: JavaScript使用window对象的open()方法来创建新的浏览器窗口; window.op ...

  10. Java 字符串截取函数 substring()

    在String中有两个substring()函数,如下: 一:String.substring(int start) 参数: start:要截取位置的索引 返回: 从start开始到结束的字符串 例如 ...