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

函数作用域和块作用域

函数中的作用域 很对人认为 JavaScript 具有基于函数的作用域,意味着每声明一个函数都会为其自身创建一个气泡,而其他结构不会创建作用域气泡。但事实上并不完全正确!...实际的结果就是在整个代码片段得到周围创建了一个作用域气泡,也就是说这段代码中的任何声明都将绑定在整个新创建的包装函数的作用域里,而不是先前所在的作用域 为什么隐藏“变量”和“函数”是一个非常有用的技术。...最小授权、最小暴露原则:在软件设计中,应该最小限度地暴露必要地内容,而将其他内容都“隐藏”起来,比如某个模块或对象的 API 设计 如果所有变量和函数都在全局作用域中,当然可以在所有的内部嵌套的作用域中去访问到他们...函数作用域 在任意代码片段外部添加包装函数,可以将内部的变量和函数定义“隐藏”起来,外部作用域无法访问包装函数内部的任何内容。虽然这种技术可以解决一些问题,但是它并不理想,因为会导致一些额外的问题。...本质上,声明一个函数内部的变量或函数会在所处的作用域隐藏起来,这是有意为之的良好软件的设计原则。 但函数不是唯一的作用域单元。块作用域指的是变量和函数不仅可以属于所处的作用域,有可以属于某个代码块。

2.8K20

JS学习系列 03 - 函数作用域和块作用域

在 ES5 及之前版本,JavaScript 只拥有函数作用域,没有块作用域(with 和 try...catch 除外)。在 ES6 中,JS 引入了块作用域,{ } 内是单独的一个作用域。...采用 let 或者 const 声明的变量会挟持所在块的作用域,也就是说,这声明关键字会将变量绑定到所在的任意作用域中(通常是 {...} 内部)。 今天,我们就来深入研究一下函数作用域和块作用域。...foo 的作用域包含了标识符a、b、c 和 bar ,函数 bar 的作用域中又包含别的标识符。...由于标识符 a、b、c 和 bar都属于函数 foo 的作用域,所以在全局作用域中访问会报错,因为它们都没有定义,但是在函数 foo 内部,这些标识符都是可以访问的,这就是函数作用域。...总结 函数是 JavaScript 中最常见的作用域单元。块作用域指的是变量和函数不仅可以属于所处的函数作用域,也可以属于某个代码块。

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

    JS学习系列 03 - 函数作用域和块作用域

    在 ES5 及之前版本,JavaScript 只拥有函数作用域,没有块作用域(with 和 try...catch 除外)。在 ES6 中,JS 引入了块作用域,{ } 内是单独的一个作用域。...采用 let 或者 const 声明的变量会挟持所在块的作用域,也就是说,这声明关键字会将变量绑定到所在的任意作用域中(通常是 {...} 内部)。 今天,我们就来深入研究一下函数作用域和块作用域。...foo 的作用域包含了标识符a、b、c 和 bar ,函数 bar 的作用域中又包含别的标识符。...由于标识符 a、b、c 和 bar都属于函数 foo 的作用域,所以在全局作用域中访问会报错,因为它们都没有定义,但是在函数 foo 内部,这些标识符都是可以访问的,这就是函数作用域。...总结 函数是 JavaScript 中最常见的作用域单元。块作用域指的是变量和函数不仅可以属于所处的函数作用域,也可以属于某个代码块。

    34810

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

    我们在 JavaScript 词法作用域不完全指北 中介绍了词法作用域,词法作用域是由你写代码时将变量和块作用域写在哪里来决定的,词法分析器处理代码时会保持作用域不变。...函数作用域 函数作用域的含义是指, 属于这个函数的全部变量都可以在整个函数的范围内使用及复用(事实上在嵌套的作用域中也可以使用)。...} } foo(); 所以,在任意代码片段外部添加包装函数, 可以将内部的变量和函数定义“隐藏” 起来, 外部作用域无法访问包装函数内部的任何内容。...感谢块作用域,解救了我们于水火之中。我在前文提到过,在 ES6 支持 let 和 const 之后,IIFE 立即执行函数表达式已经完成了它的历史使命,可以退休了。...const 关键字也遵循块作用域,可以使用它声明块作用域常量。有关 let 和 const 关键字的具体内容,将会在下篇文章中介绍。

    73710

    Python之函数【参数,返回值,嵌套调用,作用域,匿名函数】

    目录 1、简介 2、参数 3、返回值 4、嵌套调用 5、变量的作用域 5.1 局部变量 5.2 全局变量 5.3 global 关键字 6、参数进阶 6.1 形参和实参的值传递 6.2 缺省参数 7、匿名函数...# 创建一个函数 def add(i,j): print(i + j) # 调用函数 add(1,2) 1、参数的作用 函数: 把具有独⽴功能的代码块组织为⼀个⼩模块,在需要的时候调⽤;...3、返回值 在程序开发中,有时候会希望⼀个函数执⾏结束后,告诉调⽤者⼀个结果, 以便调⽤者针对具体的结果做后续的处理。 返回值是函数完成⼯作后,最后给调⽤者的⼀个结果。...1、 return 关键字 在函数中使⽤ return 关键字可以返回结果。 调⽤函数⼀⽅,可以使⽤变量来接收函数的返回结果 。...("我的名字叫 remove") # 调用函数 add() 5、变量的作用域 变量分为局部变量和全局变量。

    1.4K20

    js函数、作用域和闭包

    正确的写法是(function (a,b){return a+b ;})(), ()内部的东西是一个值,加上()代表立刻执行,整个语句相当于一个函数类型的值需要立刻执行 7、命名冲突 当在同一个作用域内定义了名字相同的变量和方法的话...1、定义 作用域(scope)指的是变量存在的范围。...2、分类: 在 ES5 的规范中,Javascript 只有两种作用域: 一种是全局作用域,变量在整个程序中一直存在,所有地方都可以读取; 另一种是函数作用域,变量只在函数内部存在。...4、作用域规则 {}不产生一个作用域,定义函数才会产生一个函数作用域 函数在执行的过程中,先从自己内部找变量 如果找不到,再从创建当前函数所在的作用域去找, 以此往上 var a = 1 function...返回的函数存的不是同一个地址,所以对于counter和counter2对应的活动对象是不一样的 9、例6写一个 sum 函数,实现如下调用方式 console.log( sum(1)(2) ) //

    1.6K20

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

    《你不知道的JavaScript》第一部分作用域和闭包第2篇。 昨天讲到作用域,回顾下概念:作用域是一套用来管理引擎如何在当前作用域以及嵌套的子作用域中根据标识符名称进行变量查找的规则。...除此以外,"隐藏"作用域中的变量和函数还能规避同名标识符之间可能存在的冲突问题。 函数作用域的创建方式 函数作用域的创建需要声明一个函数,而声明函数这个行为又有函数声明和函数表达式两种操作方式。...至于const也是可以创建块作用域中,不同于let的是,其值是固定的常量,任何对其值的修改都会引起错误。 总结一下 js中的作用域,主要有函数作用域和块级作用域,当然还有全局作用域。...函数作用域的使用,可以隐藏代码实现,减少变量暴露,避免命名冲突,符合软件设计的最小特权原则。关于函数作用域,还讲了函数声明与函数表达式的辨别方法和区别。...在函数表达式中,还分出了命名函数表达式和匿名函数表达式。 块级作用域的实现,有赖于ES6的版本进步,提供let和const关键字,可以实现同其他语言相同的由{...}包裹起来的块级作用域。

    1.1K30

    函数与作用域

    1.函数声明和函数表达式有什么区别 函数就是一段可以反复调用的代码块。函数还能接受输入的参数,不同的参数会返回不同的值。 JavaScript有三种方法,可以声明一个函数。...什么是函数的声明前置 (1)变量的声明前置 所谓的变量声明前置就是在一个作用域块中,所有的变量都被放在块的开始出声明。...和变量声明前置一样,执行代码之前会先读取函数声明,只要函数在代码中进行了声明,无论它在哪个位置上进行声明,js引擎都会将它的声明放在范围作用域的顶部。...它的目的只有两个:一是不必为函数命名,避免了污染全局变量;二是IIFE内部形成了一个单独的作用域,可以封装一些外部无法读取的私有变量。...,返回参数的平方和?

    92040

    PHP 函数篇(下):匿名函数和作用域

    函数调用该函数,第一个参数是函数名,后面的参数是函数参数(非匿名函数亦可通过 call_user_func 函数调用): $sum = call_user_func($add, $a, $b); 返回结果和上面的...前缀,其作用是标识该参数是一个可变数量的参数列表,也就是支持传入任意多个参数,从 0~N 个不等,比如我们这里传入的就是 $a 和 $b 两个参数,如果待调用函数 $function 不需要传递参数,则...2、作用域 继承父作用域变量 匿名函数(或者叫闭包函数)的一个强大功能是支持在函数体中直接引用上下文变量(继承父作用域的变量),比如在上述代码中,我们可以这样编写匿名函数实现代码: 函数 从父作用域中继承变量与使用全局变量是不同的,全局变量存在于一个全局的范围,无论当前在执行的是哪个函数,而闭包的父作用域是定义该闭包的函数,不一定是调用它的函数。...PHP_EOL; 在上述代码中,add1 中定义的闭包函数通过 use 引用了父作用域下的 $n1 和 $n2 变量,对于该闭包函数来说,其作用域是 add1 函数,而非调用它的位置,所以如果我们试图在

    1.1K20

    Kotlin | 作用域函数

    当你在提供了 lambda 表达式的对象上调用此类函数时,它会形成一个临时作用域。在此作用域内,你可以在不使用其名称的情况下访问该对象,这些函数被称为作用域函数。...每个作用域函数有两个主要区别: 引用上下文对象的方式 返回值 上下文对象(Context):this 还是 it this run、with 和 apply 通过 this 关键字引用一个 context...:Context 对象还是 Lambda 结果 作用域函数的返回值不同: applay 和 also 返回 context 对象 let、run、with 返回闭包的运算结果 返回 Context...lambda 结果 run 和 with 的作用类似,但是调用方法和 let 一样 —— 作为 context 对象的拓展函数 当你的 lambda 同时包含了对象初始化和返回值计算时,run 函数非常适合...:with takeIf 和 takeUnless 除了作用域函数之外,标准库还包含函数 takeIf 和 takeUnless。

    1.1K30

    静态作用域和动态作用域

    静态作用域和动态作用域 所谓作用域规则就是程序解析名字的方法。...显然我们还是希望这个表达式求值的结果为 3,这对采用静态作用域的语言来说仍然如此,但对于采用动态作用域语言的使用者来说这就有问题了,因为这个表达式将会返回 4。...scope,如果形式参数和实际参数的数量不匹配就会返回错误。...通过这个方式,我们就可以实现静态作用域了。当我们在当前作用域中找不到一个变量的绑定时,我们就会在捕获到的环境中向外查找,直到找到或是没有更外层的作用域为止。...动态作用域的解析则不同,我们虽然捕获了函数定义处的环境,但是我们需要先在函数被调用处的环境中进行名字查找,所以此时计算的方式需要改成这样: evalCall :: [String] -> [Expr]

    2.5K10

    JS作用域和作用域链

    在此之前,先要明确个概念,即执行环境和作用域是两个完全不同的概念。 函数的每次调用都有与之紧密相关的作用域和执行环境。...当执行流进入一个函数时,函数的环境就会被推入一个环境栈中(execution stack)。在函数执行完后,栈将其环境弹出,把控制权返回给之前的执行环境。...当代码在一个环境中执行时,会创建变量对象的一个作用域链(scope chain)。作用域链的用途是保证对执行环境有权访问的所有变量和函数的有序访问。...需要注意的是:内部环境可以通过作用域链访问所有的外部环境,但是外部环境不能访问内部环境中的任何变量和函数。 标识符解析(变量名或函数名搜索)是沿着作用域链一级一级地搜索标识符的过程。...任何一对花括号({和})中的语句集都属于一个块,在这之中定义的所有变量在代码块外都是不可见的,我们称之为块级作用域。 函数作用域就好理解了,定义在函数中的参数和变量在函数外部是不可见的。

    4.8K30

    JavaScript 作用域和作用域链

    局部作用域(Local Scope) 和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部,所有在一些地方也会看到有人把这种作用域称为函数作用域 。 如 1....中的变量 inVariable 和函数 innerFun 都只拥有局部作用域。...函数对象和其它对象一样,拥有可以通过代码访问的属性和一系列仅供 JavaScript 引擎访问的内部属性。...一个好的经验法则是:如果一个跨作用域的对象被引用了一次以上,则先把它存储到局部变量里再使用。 ---- VO & AO 变量初始化阶段 JS解释器如何找到我们定义的函数和变量?...理解 JavaScript 作用域和作用域链 JavaScript 深入浅出-慕课网

    2.1K10

    第3章 Python 基础 ( 函数返回值与作用域 )

    函数返回值与作用域 函数外部的代码要想获取函数的执行结果,就可以在函数里用return语句把结果返回 def stu_register(name, age, course='PY' ,country='...注意 函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so 也可以理解为 return 语句代表着函数的结束 如果未在函数中指定return,那这个函数的返回值为None 全局与局部变量...全局变量作用域(即有效范围)是整个程序,局部变量作用域是定义该变量的函数。...变量的查找顺序是局部变量>全局变量 当全局变量与局部变量同名时,在定义局部变量的函数内,局部变量起作用;在其它地方全局变量起作用。..., name) global name的作用就是要在函数里声明全局变量name ,意味着最上面的name = “Alex Li”**即使不写,程序最后面的print也可以打印name 传递列表、字典、集合产生的现象

    46640

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

    注意:函数体内部的语句在执行时,一旦执行到return 时,函数就执行完毕,并将结果返回。因此内部通过条件判断和循环可以在实现非常复杂的。...name:'foo'       }     } 变量作用域   在JavaScript 中,用var 声明的实际上是有作用域的。...如果一个变量在函数体内部申明,则该变量的作用域为整个函数体,在函数体外不该引用该变量。     ...+){           ...       }     } 全局作用域 不在任何函数内定义的变量就具有全局作用域,实际上,JavaScript 默认有一个全局作用域的变量实际上呗绑定到...局部作用域 由于JavaScript 的变量作用域实际上是函数内部,我们在for 循环等语句块中是无法定义具有无法定义具有局部作用域的变量的。

    1.1K90

    JS进阶:作用域和作用域链

    作用域(Scope) 1.什么是作用域 作用域是在运行时代码中的某些特定部分中变量,函数和对象的可访问性。换句话说,作用域决定了代码区块中变量和其他资源的可见性。...ES6 之前 JavaScript 没有块级作用域,只有全局作用域和函数作用域。ES6的到来,为我们提供了‘块级作用域’,可通过新增命令let和const来体现。...2.全局作用域和函数作用域 在代码中任何地方都能访问到的对象拥有全局作用域,一般来说以下几种情形拥有全局作用域: 最外层函数 和在最外层函数外面定义的变量拥有全局作用域 var outVariable...函数作用域,是指声明在函数内部的变量,和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部。...值得注意的是:块语句(大括号“{}”中间的语句),如 if 和 switch 条件语句或 for 和 while 循环语句,不像函数,它们不会创建一个新的作用域。

    3K20

    理解javascript作用域和作用域链

    作用域 作用域就是变量和函数的可访问范围,控制着变量和函数的可见性与生命周期,在JavaScript中变量的作用域有全局作用域和局部作用域。    ...作用域链 全局执行环境是最外层的一个执行环境,在web浏览器中全局执行环境是window对象,因此所有全局变量和函数都是作为window对象的属性和放大创建的。...每个函数都有自己的执行环境,当执行流进入一个函数的时候,函数的环境会被推入一个函数栈中,而在函数执行完毕后执行环境出栈并被销毁,保存在其中的所有变量和函数定义随之销毁,控制权返回到之前的执行环境中,全局的执行环境在应用程序退出...当代码在一个环境中执行时,会创建变量对象的一个作用域链(scope chain)来保证对执行环境有权访问的变量和函数的有序访问。     用一张图来解释作用域链的运行:由里向外执行。 ?    ...新的作用域链如下图所示: ?    在函数执行过程中,没遇到一个变量,都会经历一次标识符解析过程以决定从哪里获取和存储数据。

    2.2K10

    理解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声明的变量就是一个块级作用域。

    52500
    领券