静态作用域和动态作用域

静态作用域指的是一段代码,在它执行之前就已经确定了它的作用域,简单来说就是在执行之前就确定了它可以应用哪些地方的作用域(变量)。
动态作用域–函数的作用域是在函数调用的时候才决定的

JavaScript采用的是词法作用域即静态作用域;

// 静态作用域:
var a = 10;

function fn() {
var b = 1;
console.log(a + b);
}

fn(); // 11

在创建fn函数时的时候就已经确定了它可以作用哪些变量,如果函数fn里面有变量a就直接操作变量a,
如果没有就往上一级查找,这就是静态作用域

// 动态作用域:
function foo() {
console.log(a);
}

function bar() {
var a = 3;
foo();
}

var a = 2;
bar(); // 2;

bar 调用,bar里面foo被调用,foo函数需要查找变量a,由于JavaScript是词法作用域(即静态作用域),foo被解析时在全局作用域.
所以只能在全局作用域中找a,输出结果为2,而非bar作用域中的a。如果js采用的时动态作用域,那么foo在bar中调用,就会先在bar中查询a,输出为3。

原文地址:https://www.cnblogs.com/xiaoniaohhl/p/11117715.html

时间: 2024-08-29 13:46:10

静态作用域和动态作用域的相关文章

深入作用域之静态作用域与动态作用域

概念: 静态作用域指的是一段代码,在它执行之前就已经确定了它的作用域,简单来说就是在执行之前就确定了它可以应用哪些地方的作用域(变量). 动态作用域在代码执行的时候才确定它的作用域的,以及作用域链. 静态作用域: var a = 10; function fn(){ var b = 1; console.log(a+b); } fn(); //11 在创建函数fn的时候就已经确定了它可以作用那些变量,如果函数fn里面有变量a就直接作用函数fn里面的变量a,如果没有就往上一级找,这就是静态作用域.

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

× 目录 [1]词法 [2]动态 前面的话 大多数时候,我们对作用域产生混乱的主要原因是分不清楚应该按照函数位置的嵌套顺序,还是按照函数的调用顺序进行变量查找.再加上this机制的干扰,使得变量查找极易出错.这实际上是由两种作用域工作模型导致的,作用域分为词法作用域和动态作用域,分清这两种作用域模型就能够对变量查找过程有清晰的认识.本文是深入理解javascript作用域系列第二篇——词法作用域和动态作用域 词法作用域 第一篇介绍过,编译器的第一个工作阶段叫作分词,就是把由字符组成的字符串分解成

词法作用域 vs 动态作用域

词法作用域 vs 动态作用域 链接:https://www.jianshu.com/p/cdebb5965000 scheme是一门采用词法作用域(lexical scoping)的lisp方言,这个设计是从alogol语言里借鉴过来的.现在,词法作用域已经被许多lisp方言所吸收,实践表明,这的确是一项正确的设计,避免了很多奇怪的错误,比较符合人类的思维习惯. 但是,在某些场合下,动态作用域又是很有用的特性,比如emacs lisp里面就默认采用动态作用域. 下面的程序演示了词法作用域与动态作

JavaScript 词法、静态、动态作用域初级理解

开始之前 由于本人也是JavaScript初学者,记录学习经过,怕以后会忘记. 对于JavaScript 初学者来说,最难的不是代码部分,而是对很多书籍中的术语的理解,大多时候想要理解一段JavaScript书籍中的解释内容,就会涉及很多术语,在术语不通的情况下都会对内容理解偏差(导致很难记住所学内容),由于本人在阅读书籍时经常会遇到这一问题,所以今天将记下这一基础内容. 一.需要关注点 1)执行环境(作用域)函数执行环境 变量作用域 2)函数作用域和声明提前 3)自由变量 4)词法作用域和静态

js 函数作用域, 块级作用域和词法作用域

函数作用域, 块级作用域和词法作用域 0 作用域: 0.1 作用域是程序源代码中定义变量的区域. 0.2 作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限. 0.3 ECMAScript6之前只有全局作用域和函数作用域. 0.4 JavaScript采用词法作用域(lexical scoping),也就是静态作用域. var scope = "global scope"; function checkscope(){ var scope = "local sc

动态作用域与this +apply和call +bind

词法作用域是一套关于引擎如何寻找变量以及会在何处找到变量的规则. (函数作用域和块作用域) JavaScript 中的作用域就是词法作用域,也就是静态作用域,由定义代码决定 动态作用域似乎暗示有很好的理由让作用域作为一个在运行时就被动态确定的形式,而不是在写代码时进行静态确定的形式 动态作用域并不关心函数和作用域是如何声明以及在何处声明的,只关心它们从何处调用.换句话说,作用域链是基于调用栈的,而不是代码中的作用域嵌套 ps:可以忽略下面这段话 : 静态类型语言是指在编译时变量的数据类型即可确定

区分词法作用域(js)与动态作用域(精!)

在js学习中,词法作用域是必须要掌握的! 在这里,我将总结一下<你不知道的JS>一书中词法作用域的重点并分享给大家! 首先带来一段代码示例: function foo(){ console.log(a);//2 } function bar(){ var a = 3; foo(); } var a = 2; bar(); js词法作用域输出结果:"2"; 动态作用域输出结果:"3" 下面我将对两种作用域的输出结果进行分析: #在对结果分析之前首先我们要了

JSP-讲解(生成java类、静态导入与动态导入)

一.JSP技术简介 JSP是Java Server Page的缩写,它是Servlet的扩展,它的作用是简化网站的创建和维护. JSP是HTML代码与Java代码的混合体. JSP文件通常以JSP或JSPX的扩展名. JSP拥有自己的语法. JSP形式上像HTML,但本质上是Servlet. JSP的出现,使得将Web开发中的HTML与业务逻辑代码有效分离成为可能.通常JSP只负责生成动态的HTML文档,而业务逻辑由其他Java组件如JavaBean来实现.JSP可以通过Scriptlet来访问

C++中的自动存储、静态存储和动态存储

根据用于分配内存的方法,C++中有3中管理数据内存的方式:自动存储.静态存储和动态存储(有时也叫做自由存储空间或堆).在存在是间的长短方面,以这三种方式分配的数据对象各不相同.下面简要介绍这三种类型(注:C++11中新增了第四种类型——线程存储)1.自动存储在函数内部定义的常规变量使用自动存储空间,被称为自动变量(automatic variable),这意味着它们在所属的函数被调用时自动产生,在该函数结束时消亡.例如,挡在一个自定义的函数getname()中定义了一个temp数组时,temp数