JS中的两种作用域是什么,执行过程分别是怎样
Admin 2022-07-01 群英技术资讯 455 次浏览
在文章最开始,先学习几个概念:
JavaScript采用的是静态作用域,函数定义的位置就决定了函数的作用域。
具体看一个例子,理解一下什么是静态作用域与动态作用域的区别
var val = 1; function test() { console.log(val); } function bar() { var val = 2; test(); } bar(); // 结果是???
上面代码中:
当执行 test 函数时,先从 test 函数内部查找是否有变量 val,如果没有,就沿定义函数的位置,查找上一层的代码,查找到全局变量 val ,其值为 1。
作用域查找始终从运行时所处的最内层作用域开始查找,逐级向外查找,直到遇见第一个匹配的标识符为止。
无论函数在哪里被调用,无论如何被调用,它的作用域只由函数定义所处的位置决定。
执行 test 函数,首先从函数内部查询 val 变量,如果没有,就从调用函数的作用域,即 bar 函数的作用域内部查找变量 val,所以打印结果 2
我们来看三个习题,好好消化理解一下静态作用域: 函数定义位置就决定了作用域。
var a = 1 function fn1(){ function fn3(){ var a = 4 fn2() } var a = 2 return fn3 } function fn2(){ console.log(a) } var fn = fn1() fn()
上面代码中:
做题之前,一定要理解 静态作用域 的概念。该题 fn2 定义在全局上,当 fn2 中找不到变量 a 时,它会去全局中寻找,与 fn1 和 fn3 毫无关系,打印 1.
var a = 1 function fn1(){ function fn2(){ console.log(a) } function fn3(){ var a = 4 fn2() } var a = 2 return fn3 } var fn = fn1() fn()
fn2 是定义在函数 fn1 内部,因此当 fn2 内部没有变量 a 时,它会去 fn1 中寻找,跟函数 fn3 毫无关系,如果 fn1 中寻找不到,会到 fn1 定义的位置的上一层(全局)寻找,直至寻找到第一个匹配的标识符。本题可以在 fn1 中找到变量 a,打印 2
var a = 1; function fn1(){ function fn3(){ function fn2(){ console.log(a) } var a; fn2() a = 4 } var a = 2 return fn3 } var fn = fn1() fn()
该题 fn2 定义在函数 fn3 中,当 fn2 中找不到变量 a 时,会首先去 fn3 中查找,如果还查找不到,会到 fn1 中查找。本题可以在 fn3 中找到变量 a,但由于 fn2() 执行时,a 未赋值,打印 undefined。
关于JavaScript 的静态作用域,我们只需要记住一句话:函数定义的位置就决定了函数的作用域,遇到题目时不要被别的代码干扰到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
本篇文章给大家带来了关于javascript的相关知识,其中主要整理了处理树状结构数据的增删改查的相关问题,相比普通的数组结构数据,树状结构的处理就没有数组那么的直观,但是也没那么复杂,需要多一步递归查找来对数据进行深度遍历操作,下面一起来看一下,希望对大家有帮助。
这篇文章主要介绍了利用 JavaScript 构建命令行应用,下面文章围绕如何利用JavaScript 构建命令行应用的相关资料炸开详细内容,需要的朋友可以参考一下
AJAX优点是可以异步请求服务器的数据,实现页面数据的实时动态加载, 在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。jquery在全局对象jquery(也就是$)绑定了ajax()函数,可以处理Ajax请求,ajax常用的配置选项有
这篇文章小编给大家分享的是Nodejs中fs文件系统怎样使用的内容,下文对fs文件系统怎样使用介绍的很详细,感兴趣的朋友可以了解看看,下面让我们一起来学习一下吧!
这篇文章主要介绍了vue data有值,但是页面{{}} 取不到值的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008