`

深入--词法作用域和动态作用域

 
阅读更多

javascript标题深入开头文章转自:https://github.com/mqyqingfeng/Blog 文章某些部分可能因为理解不同做一些修改

 

作用域指对某一变量或方法具有访问权限的代码空间,javascript采用词法作用域,也就是静态作用域。js没有块级作用域。

 

静态作用域,变量和方法的作用域在定义时就确定了

动态作用域,变量和方法的作用域在运行时才确定

 

举个例子:

var value = 1;
function foo(){
   console.log(value);
}

function bar(){
    var value = 2;
    foo();
}

bar();

//结果为1

 执行foo函数,函数内部没有局部变量value,就在foo函数定义的上一级查找value=1;

 

如果是动态作用域,foo函数内部查找不到value变量,就从调用函数的作用域,也就是是bar函数内部查找value变量,所以结果会是2

 

 

比如说bash就是动态作用域,把下面脚本存成例如scope.bash,然后执行bash ./scope.bash看看打印值

value=1
function foo () {
    echo $value;
}
function bar () {
    local value=2;
    foo;
}
bar

 

 

下面是《javascript权威指南》中的例子:

var scope = "global scope";
function checkscope(){
   var scope = "local scope";
   function f(){
         return scope;
   }
   return f();
}
checkscope();

 

var scope = "globle scope";
function checkscope(){
       var scope = "local scope";
       function f(){
            return scope;
       }
       return f;
}
checkscope()();

 

两段代码的结果都是:localscope

原因很简单,javascript采用的是词法作用域,函数的作用域基于函数创建的位置

而引用《javascript权威指南》的回答就是:

javascript函数的执行用到了作用域链,这个作用域链是在函数定义的时候创建的。嵌套的函数f()定义在这个作用域链里,其中的变量scope一定是局部变量,不管何时何地执行函数f(),这种绑定在执行f()时依然有效。

 

但是这里想让大家思考的是:

虽然两段代码执行的结果一样,但是两段代码究竟有哪些不同?

 

回答这个问题,要牵涉很多内容,词法作用域只是其中一小部分,请看下篇《深入--执行上下文栈》

分享到:
评论

相关推荐

    yjc930214#Blog-1#词法作用域1

    两个例子var scope= 'global scope'var scope= 'global scope'由于JavaScript采用词法作用域,函数的作用域

    深化理解javascript作用域其次篇之词法作用域和动态作用域_.docx

    深化理解javascript作用域其次篇之词法作用域和动态作用域_ 深化理解javascript作用域其次篇之词法作用域和动态作用域,是javascript中非常重要的一部分。理解词法作用域和动态作用域对javascript的编程至关重要。...

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

    本文是深入理解javascript作用域系列第二篇——词法作用域和动态作用域 词法作用域  第一篇介绍过,编译器的第一个工作阶段叫作分词,就是把由字符组成的字符串分解成词法单元。这个概念是理解词法作用域的基础  ...

    Javascript的词法作用域分析.pdf

    在词法作用域的分析中,我们可以通过几个小例子来深入了解词法作用域的机理。例如,在以下代码中: ```javascript function a(i) { var i; alert(i); a(i); } a(10); ``` 在上面的代码中,我们定义了一个函数a...

    一篇文章搞懂:词法作用域、动态作用域、回调函数及闭包

    在编程领域,理解和掌握词法作用域、动态作用域、回调函数以及闭包是非常重要的概念,它们直接影响着代码的执行逻辑和内存管理。下面我们将详细探讨这些主题。 首先,词法作用域(Lexical Scoping)是一种变量作用...

    对C--语言的词法分析器、语法分析器.zip

    语义分析检查程序的逻辑正确性,例如类型检查和作用域分析;中间代码生成将抽象语法树转换为一种独立于机器的中间表示;优化阶段会改进代码的效率;最后,目标代码生成将中间代码转换为特定机器架构的机器码。 在...

    网易JS面试题与Javascript词法作用域说明

    JavaScript中的词法作用域是编程中的一个重要概念,它决定了变量的可访问性和作用范围。根据题目描述,我们来深入理解这一知识点。 首先,JavaScript的词法作用域在函数定义时就已经确定,而不是在函数执行时。这...

    JavaScript程序设计-变量作用域.pdf

    本文将深入探讨JavaScript中的全局变量、局部变量、变量提升、词法作用域以及作用域链。 1.1 全局变量与局部变量 全局变量在整个程序中都可访问,即使在函数内部定义,它们也会成为全局变量,除非在函数内部重新...

    javascript 词法作用域和闭包分析说明

    在深入探讨JavaScript中的词法作用域与闭包之前,首先需要了解作用域的概念。作用域定义了变量访问的规则,决定了代码在何处以及如何查找变量。JavaScript中的词法作用域,也就是静态作用域,意味着变量的作用域在...

    FX.rar_FX-PLC-COM_词法分析_词法语法语义_语义_语法分析器

    它不仅检查语法,还检查类型一致性、作用域规则和程序的其他复杂性。例如,语义分析器会确认变量"X"是否已被正确声明,以及"5"是否可以赋值给"int"类型的变量。这个阶段可能包括类型检查、常量折叠(Constant ...

    深入了解JavaScript词法作用域

    JavaScript的词法作用域是编程中的关键概念,它决定了变量的可见性和生命周期。在JavaScript中,作用域由函数定义的位置决定,而不是代码块(如if语句或for循环)的位置,这就是所谓的函数作用域。不同于其他一些...

    深入了解JavaScript,优化作用域链(2).pdf

    最后,作用域链和作用域优化的知识点还可以涉及到词法作用域、动态作用域、变量提升、作用域提升、立即调用函数表达式(IIFE)等高级概念。学习和掌握这些概念对于编写高性能的JavaScript代码至关重要。

    10-作用域链和闭包:代码中出现相同的变量,JavaScript引擎是如何选择的?_For_vip_user_0011

    "作用域链和闭包:代码中出现相同的变量,...通过了解作用域链、词法作用域和闭包,我们就可以更好地理解JavaScript引擎是如何选择相同的变量的。同时,我们也可以更好地理解JavaScript的执行机制和闭包的应用。

    夯实基础中篇-图解作用域链和闭包.doc

    最后,**闭包**是函数能够记住并访问其词法作用域内变量的能力,即使该函数已经返回并且其外部词法作用域不再存在。在以下示例中: ```javascript var globalVariable = 1 const scriptVariable = 2 function test...

    精选_C--语言的词法文法语法语义分析及MIPS汇编生成_源码打包

    这包括类型检查、作用域解析和常量折叠等任务。例如,语义分析会确保变量在使用前已被正确声明,函数调用的参数类型与函数定义匹配,以及表达式的计算结果符合预期类型。此阶段也可能涉及优化,如死代码删除和常量...

    005课-继承作用域闭包.rar

    此外,JavaScript还引入了块级作用域的概念(通过let和const关键字),以及函数作用域和词法作用域的概念。词法作用域是指函数的执行上下文由其定义时的位置决定,而不是调用时的位置。 **闭包** 闭包是JavaScript...

    深入理解JavaScript作用域共12页.pdf.zip

    此外,JavaScript还引入了闭包,这是一种特殊的作用域现象,允许函数访问并操作其词法作用域内的变量,即使该函数在其外部被调用。闭包在实现数据封装和模块化编程时非常有用。 作用域规则还涉及到变量声明。在ES5...

Global site tag (gtag.js) - Google Analytics