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()时依然有效。
但是这里想让大家思考的是:
虽然两段代码执行的结果一样,但是两段代码究竟有哪些不同?
回答这个问题,要牵涉很多内容,词法作用域只是其中一小部分,请看下篇《深入--执行上下文栈》
相关推荐
两个例子var scope= 'global scope'var scope= 'global scope'由于JavaScript采用词法作用域,函数的作用域
深化理解javascript作用域其次篇之词法作用域和动态作用域_ 深化理解javascript作用域其次篇之词法作用域和动态作用域,是javascript中非常重要的一部分。理解词法作用域和动态作用域对javascript的编程至关重要。...
本文是深入理解javascript作用域系列第二篇——词法作用域和动态作用域 词法作用域 第一篇介绍过,编译器的第一个工作阶段叫作分词,就是把由字符组成的字符串分解成词法单元。这个概念是理解词法作用域的基础 ...
在词法作用域的分析中,我们可以通过几个小例子来深入了解词法作用域的机理。例如,在以下代码中: ```javascript function a(i) { var i; alert(i); a(i); } a(10); ``` 在上面的代码中,我们定义了一个函数a...
在编程领域,理解和掌握词法作用域、动态作用域、回调函数以及闭包是非常重要的概念,它们直接影响着代码的执行逻辑和内存管理。下面我们将详细探讨这些主题。 首先,词法作用域(Lexical Scoping)是一种变量作用...
语义分析检查程序的逻辑正确性,例如类型检查和作用域分析;中间代码生成将抽象语法树转换为一种独立于机器的中间表示;优化阶段会改进代码的效率;最后,目标代码生成将中间代码转换为特定机器架构的机器码。 在...
JavaScript中的词法作用域是编程中的一个重要概念,它决定了变量的可访问性和作用范围。根据题目描述,我们来深入理解这一知识点。 首先,JavaScript的词法作用域在函数定义时就已经确定,而不是在函数执行时。这...
本文将深入探讨JavaScript中的全局变量、局部变量、变量提升、词法作用域以及作用域链。 1.1 全局变量与局部变量 全局变量在整个程序中都可访问,即使在函数内部定义,它们也会成为全局变量,除非在函数内部重新...
在深入探讨JavaScript中的词法作用域与闭包之前,首先需要了解作用域的概念。作用域定义了变量访问的规则,决定了代码在何处以及如何查找变量。JavaScript中的词法作用域,也就是静态作用域,意味着变量的作用域在...
它不仅检查语法,还检查类型一致性、作用域规则和程序的其他复杂性。例如,语义分析器会确认变量"X"是否已被正确声明,以及"5"是否可以赋值给"int"类型的变量。这个阶段可能包括类型检查、常量折叠(Constant ...
JavaScript的词法作用域是编程中的关键概念,它决定了变量的可见性和生命周期。在JavaScript中,作用域由函数定义的位置决定,而不是代码块(如if语句或for循环)的位置,这就是所谓的函数作用域。不同于其他一些...
最后,作用域链和作用域优化的知识点还可以涉及到词法作用域、动态作用域、变量提升、作用域提升、立即调用函数表达式(IIFE)等高级概念。学习和掌握这些概念对于编写高性能的JavaScript代码至关重要。
"作用域链和闭包:代码中出现相同的变量,...通过了解作用域链、词法作用域和闭包,我们就可以更好地理解JavaScript引擎是如何选择相同的变量的。同时,我们也可以更好地理解JavaScript的执行机制和闭包的应用。
最后,**闭包**是函数能够记住并访问其词法作用域内变量的能力,即使该函数已经返回并且其外部词法作用域不再存在。在以下示例中: ```javascript var globalVariable = 1 const scriptVariable = 2 function test...
这包括类型检查、作用域解析和常量折叠等任务。例如,语义分析会确保变量在使用前已被正确声明,函数调用的参数类型与函数定义匹配,以及表达式的计算结果符合预期类型。此阶段也可能涉及优化,如死代码删除和常量...
此外,JavaScript还引入了块级作用域的概念(通过let和const关键字),以及函数作用域和词法作用域的概念。词法作用域是指函数的执行上下文由其定义时的位置决定,而不是调用时的位置。 **闭包** 闭包是JavaScript...
此外,JavaScript还引入了闭包,这是一种特殊的作用域现象,允许函数访问并操作其词法作用域内的变量,即使该函数在其外部被调用。闭包在实现数据封装和模块化编程时非常有用。 作用域规则还涉及到变量声明。在ES5...