首页
学习
活动
专区
圈层
工具
发布

JavaScript 函数作用域和块作用域不完全指北

我们在 JavaScript 词法作用域不完全指北 中介绍了词法作用域,词法作用域是由你写代码时将变量和块作用域写在哪里来决定的,词法分析器处理代码时会保持作用域不变。...那么究竟什么时候才会生成新的作用域呢?最常见的答案是 JavaScript 具有基于函数的作用域,这意味着每声明一个函数都会为其自身创建一个作用域。...其次,必须显式地通过函数名(foo()) 调用这个函数才能运行其中的代码。 如果函数不需要函数名(或者至少函数名可以不污染所在作用域), 并且能够自动运行,这将会更加理想。...console.log( a ); // 2 匿名也就意味着没有名字,不会被外部调用,自然不会污染外部作用域。...所以我们在使用匿名函数表达式时应该着重考虑代码的可读性、可理解性。 块作用域 尽管函数作用域是最常见的作用域单元, 当然也是现行大多数 JavaScript 中最普遍的设计方法。

86110
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    JavaScript 基础(五) 函数 变量和作用域

    函数定义和调用    定义函数,在JavaScript中,定义函数的方式如下:       function abs(x){         if(x >=0){           ...还有一个免费赠送的关键字 arguments,它只在函数内部起作用,并且永远指向当前函数的调用者传入的所有参数。       ...name:'foo'       }     } 变量作用域   在JavaScript 中,用var 声明的实际上是有作用域的。...+){           ...       }     } 全局作用域 不在任何函数内定义的变量就具有全局作用域,实际上,JavaScript 默认有一个全局作用域的变量实际上呗绑定到...局部作用域 由于JavaScript 的变量作用域实际上是函数内部,我们在for 循环等语句块中是无法定义具有无法定义具有局部作用域的变量的。

    1.3K90

    函数创建.作用域,自调用

    和php的类型不详说了function funname{ }创建 javascript">         function sum(x,y){             ...        qiuhe=sum(5,3);         alert(qiuhe);         qiuhe2=sum(1,8);         document.write(qiuhe2); 函数作用域...: ps:在函数外声明的变量作用域为全局变量,任何地方都可以使用             函数内部通过var声明的变量是局部变量,内部没有通过var创建的变量是全局变量             作用域不是全局变量的就是局部变量...        qiuhe=sum(5,3);         alert(qiuhe);         qiuhe2=sum(1,8);         document.write(qiuhe2); 函数自调用...:    //用括号将函数体包围,等同于调用函数名,加括号表示调用;自调用等于括号包围函数体加括号         (function test(){ alert('函数自调用,你好年轻人!')})

    84720

    《你不知道的JavaScript》:函数作用域和块作用域

    《你不知道的JavaScript》第一部分作用域和闭包第2篇。 昨天讲到作用域,回顾下概念:作用域是一套用来管理引擎如何在当前作用域以及嵌套的子作用域中根据标识符名称进行变量查找的规则。...除此以外,"隐藏"作用域中的变量和函数还能规避同名标识符之间可能存在的冲突问题。 函数作用域的创建方式 函数作用域的创建需要声明一个函数,而声明函数这个行为又有函数声明和函数表达式两种操作方式。...匿名函数表达式的应用非常常见,很多工具或库都有用到,但其也存在几个缺点: 匿名函数在栈中不显示有意义函数名,调试困难; 由于没有函数名,所以如需调用自身,比如递归或者事件触发后事件监听器需要解绑自身等,...函数作用域的使用,可以隐藏代码实现,减少变量暴露,避免命名冲突,符合软件设计的最小特权原则。关于函数作用域,还讲了函数声明与函数表达式的辨别方法和区别。...在函数表达式中,还分出了命名函数表达式和匿名函数表达式。 块级作用域的实现,有赖于ES6的版本进步,提供let和const关键字,可以实现同其他语言相同的由{...}包裹起来的块级作用域。

    1.3K30

    函数作用域和块作用域

    函数中的作用域 很对人认为 JavaScript 具有基于函数的作用域,意味着每声明一个函数都会为其自身创建一个气泡,而其他结构不会创建作用域气泡。但事实上并不完全正确!...实际的结果就是在整个代码片段得到周围创建了一个作用域气泡,也就是说这段代码中的任何声明都将绑定在整个新创建的包装函数的作用域里,而不是先前所在的作用域 为什么隐藏“变量”和“函数”是一个非常有用的技术。...首先必须要声明一个具名函数 foo,意味着这个名称本身污染了所在作用域。其次,必须显示地通过函数名去调用这个函数才能运行起里面的代码。如果函数可以不需要函数名,且能够自动运行起来那会更理想。...小结 函数是JavaScript中最常见的作用域单元。...本质上,声明一个函数内部的变量或函数会在所处的作用域隐藏起来,这是有意为之的良好软件的设计原则。 但函数不是唯一的作用域单元。块作用域指的是变量和函数不仅可以属于所处的作用域,有可以属于某个代码块。

    3.1K20

    理解javascript作用域和作用域链

    作用域 作用域就是变量和函数的可访问范围,控制着变量和函数的可见性与生命周期,在JavaScript中变量的作用域有全局作用域和局部作用域。    ...全局和局部作用域下面用一张图来解释: ? 单纯的JavaScript作用域还是很好理解的。...作用域链 全局执行环境是最外层的一个执行环境,在web浏览器中全局执行环境是window对象,因此所有全局变量和函数都是作为window对象的属性和放大创建的。...当代码在一个环境中执行时,会创建变量对象的一个作用域链(scope chain)来保证对执行环境有权访问的变量和函数的有序访问。     用一张图来解释作用域链的运行:由里向外执行。 ?    ...新的作用域链如下图所示: ?    在函数执行过程中,没遇到一个变量,都会经历一次标识符解析过程以决定从哪里获取和存储数据。

    2.4K10

    理解JavaScript作用域和作用域链

    ​一、JavaScript中的作用域 作用域是当前的执行上下文,值和表达式在其中“可见”或可被访问。如果一个变量或表达式不在当前的作用域中,那么它是不可用的。...function foo() { var x = 'sfa' } console.log(x) // x is not defined 全局作用域和函数作用域 全局作用域:在JavaScript...中 {} 外面的作用域就是全局作用域,里面的变量和函数等其他资源可以在任意地方被访问到。...一般来说以下几种情况拥有全局作用域 最外层函数和在最外层函数外面定义的变量 // 该函数和该变量供全局使用,foo函数内部依旧能够使用foo函数(此处未演示) var a = 23; function...块级作用域 ES6新增的块级作用域:用let和const声明的变量才存在块级作用域,在该代码块外部访问不到该变量。在{ }中用let和const声明的变量就是一个块级作用域。

    68200

    JavaScript中的作用域和作用域链

    作用域(Scope) 1. 作用域 作用域是在运行时代码中的某些特定部分中变量,函数和对象的可访问性。换句话说,作用域决定了代码区块中变量和其他资源的可见性。...ES6 之前 JavaScript 没有块级作用域,只有全局作用域和函数作用域。ES6 的到来,为我们提供了‘块级作用域’,可通过新增命令 let 和 const 来体现。 2....3.函数作用域 函数作用域,是指声明在函数内部的变量,和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部。...——要到创建 fn 函数的那个作用域中取,无论 fn 函数将在哪里调用。 所以,不要在用以上说法了。相比而言,用这句话描述会更加贴切: “要到创建这个函数的那个域”。...}) () //直接调用函数 }) () //直接调用函数 在上面代码中,JavaScript 引擎首先在最内层活动对象中查询属性 a、b、c 和 d,从中只找到了属性 d,并获得它的值(

    3K10

    JavaScript 作用域和事件

    作用域是可访问变量的集合。 JavaScript 作用域 在 JavaScript 中, 对象和函数同样也是变量。 在 JavaScript 中, 作用域为可访问变量,对象,函数的集合。...JavaScript 函数作用域: 作用域在函数内修改。 JavaScript 局部作用域 变量在函数内声明,变量为局部变量,具有局部作用域。 局部变量:只能在函数内部访问。...局部变量在函数开始执行时创建,函数执行完后局部变量会自动销毁。 JavaScript 全局变量 变量在函数外定义,即为全局变量。 全局变量有 全局作用域: 网页中所有脚本和函数均可使用。 ...定义全局变量:在函数内部不使用 var、let 或 const 等关键字声明变量时,该变量会被视为全局变量,从而可以在函数外部访问。但这种做法通常不推荐,因为它可能导致意外的副作用和代码难以维护。...属性和方法:定义在全局作用域中的变量和函数都会变成 window 对象的属性和方法,因此可以在调用时省略 window,直接使用变量名或函数名。

    19810

    【深度剖析】JavaScript中块级作用域与函数作用域

    面试官必问系列:深入理解JavaScript块和函数作用域 • 在 JavaScript 中,究竟是什么会生成一个新的作用域,只有函数才会生成新的作用域吗?...那 JavaScript 其他结构能生成新的作用域吗? 3.1 函数中的作用域 • 在之前的词法作用域中可见 JavaScript 具有基于函数的作用域,这也就意味着一个函数都会创建一个新的作用域。...无论表示声明出现在作用域中的何处,这个标识符所代表的变量和函数都附属于所处作用域的作用域中。...换句话说,可把变量和函数包裹在一个函数的作用域中,然后用这个作用域来 "隐藏" 他们。 • 为什么 "隐藏" 变量和函数是一个有用的技术?...函数时 JavaScript 中最常见的作用域单元。 2. 块作用域值的是变量和函数布局可以属于所处的作用域,也可以属于某个代码块(通常指 {...} 内部) 3.

    80410

    【JavaScript】作用域 ③ ( JavaScript 作用域链 | 作用域链变量查找机制 )

    一、JavaScript 作用域链 1、作用域 在 JavaScript 中 , 任何代码都有 作用域 , 全局作用域 : 在 标签中 或者 js 脚本中 定义的变量 属于 全局作用域...JavaScript 的重要的概念 , 用于 查找 变量名 对应的 不同作用域的 变量 ; 当 JavaScript 代码 执行时 , 会创建变量对象的 作用域链 , 其用途是保证对执行环境有权访问的所有变量和函数的有序访问...; 3、作用域链变量查找机制 在 JavaScript 代码中 的 嵌套作用域 中 , 查找 变量 或 函数 的 机制就是 作用域链 的 链式查找机制 ; 内部函数 在 访问 指定名称的 变量时 ,...num 变量 console.log("in_fun : num = " + num) } // 调用内部函数...+ num) } // 打印查找的 num 变量 console.log("global : num = " + num) // 调用外部函数

    56210

    【JavaScript】作用域 ① ( JavaScript 作用域 | 全局作用域 | 局部作用域 | JavaScript 变量 | 全局变量 | 局部变量 )

    一、JavaScript 作用域 1、作用域概念 在 JavaScript 代码中 , 使用的 变量 / 函数 等 名称 在 声明后 , 并不是 在所有的位置 都有效的 , 限定 上述 变量 / 函数...名称 生效的代码范围 就是 " 作用域 " ; " 作用域 " 可以控制 变量 / 函数 的 可访问性 , 即 变量 / 函数 在哪些代码区域可以被调用 , 在哪些区域不能被调用 ; 作用域 可以 提高程序的...可维护性 , 避免 命名冲突 , 在不同的作用域中 , 可以使用相同的名称 ; 2、全局作用域 和 局部作用域 JavaScript 的 作用域 分为 全局作用域 和 局部作用域 两种类型 : 全局作用域...局部作用域 function add() { // 该 num 变量 和 num2 变量 都是局部变量 // 这两个变量只能在 函数的内部可以访问...中 , 相同名称 的变量 本作用域的 变量 优先级较高 ; 二、JavaScript 变量 1、全局变量 和 局部变量 JavaScript 变量 根据 其 被声明的 作用域类型 , 分为 全局变量

    83510

    JavaScript——作用域

    局部作用域:在函数内部就是局部作用域(函数作用域),这个代码的名字只在函数内部起效果和作用。 变量的作用域 根据作用域的不同,我们变量分为全局变量和局部变量。 全局变量:在全局作用域下声明的变量。...JavaScript解析器在运行JavaScript代码的时候分为两步:预解析和代码执行。 预解析:js引擎会把js里面的所有var还要function提升到当前作用域的最前面。...预解析分为变量预解析(变量提升)和函数预解析(函数提升) 变量提升:就是把所有的变量声明提升到当前的作用域前面,不提升赋值操作。...:就是把所有的函数声明提升到当前作用域的最前面,不调用函数。...注意:函数表达式调用必须写在函数表达式的下面。

    55220

    JavaScript作用域

    全局变量:声明的变量是使用var声明的,那么这个变量就是全局变量,全局变量可以在页面的任何位置使用 除了函数以外,其他的任何位置定义的变量都是全局变量,如果函数里面的变量没有用var修饰,那么外部也是可以使用的...局部变量:在函数内部定义的变量,是局部变量,外面不能使用 全局变量,如果页面不关闭,那么就不会释放,就会占空间,消耗内存 块级作用域:一对大括号就可以看成是一块,在这块区域中定义的变量,只能在这个区域中使用...,但是在js中在这个块级作用域中定义的变量,外面也能使用; 说明:js没有块级作用域,只有函数除外 隐式全局变量:声明的变量没有var,就叫隐式全局变量 全局变量是不能被删除的,隐式全局变量是可以被删除的

    48030

    JavaScript的作用域和块级作用域概念理解

    说到这里我们需要理解两个概念:块级作用域与函数作用域。 函数作用域 这个应该好理解,函数作用域就是说定义在函数中的参数和变量在函数外部是不可见的。 大多数类C语言都拥有块级作用域,JS却没有。...正如我们举的C语言的例子,大多数类C语言都是有块级作用域的,那么在JavaScript又有什么不同呢?...是否还记得,在一个函数中定义的变量,当这个函数调用完后,变量会被销毁,我们是否可以用这个特性来模拟出JS的块级作用域呢?...,当函数调用完毕,变量i自动销毁,因此,我们在块外便无法访问了。...在JS中,为了防止命名冲突,我们应该尽量避免使用全局变量和全局函数。那么,该如何避免呢?

    97020

    JavaScript—作用域

    JavaScript—作用域 通常来说,一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。...作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。 一、作用域(es6之前) 1.全局作用域 在整个script标签或者一个.js文件中。...2.局部作用域(函数作用域) 在函数内部,只在函数内部起效果和作用。...二、变量的作用域 1.全局变量 在全局作用域下的变量。 ※ 在函数内部没有声明而直接赋值的变量也属于全局变量。 2.局部变量 在局部作用域下的变量。...三、作用域链 如果在函数中还有函数,那么在这个作用域中就又诞生了一个作用域。 根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称作”作用域链“。

    40110
    领券