在前端学习中,作用域的问题被广泛提出。什么是作用域,什么是作用域链?在Javascript中,如何理解这些概念是学好这门语言的关键,所以在学习前端开发的过程中,学习和总结javascript----scope对我来说是很有必要也很有必要的。scope不难,但是很少有人能深入的解释scope是什么。知道但不知道为什么显然是不够的,下面就简单的解释一下吧。本博文旨在深入分析范围,如有总结不足之处,请阅读海涵,并在评论区指出。说到作用域,就不得不说到名词执行环境。什么是执行环境?执行环境是Javascript中最重要的概念。它定义了可以访问其他数据并确定它们各自行为的变量或函数。那么在每一个执行环境中都有一个叫做“变量对象”的对象。执行环境中的所有变量和函数都存储在这个对象中。无法访问此对象。它只能由后台的javascript解释器访问。进入。浏览器在解析Javascript代码时,会为每个函数创建一个执行环境,并在执行环境中生成一个变量对象,用于存放变量及其内部函数。我们经常使用的窗口是最外围的执行环境,也叫全局执行环境。每个执行环境的代码执行完成后,环境被销毁,其中的变量对象也会被销毁,而全局执行环境只会在浏览器或网页关闭时被销毁,其他执行环境(或内部环境)是本地执行环境(功能)。每个函数都有自己的执行环境,所以当代码的执行流程进入一个函数时,执行环境会被压入一个环境栈,在函数执行完成后弹出,执行环境当代码在执行环境中执行,环境中的变量对象将连接到作用域链。作用域链的作用是确保有序地访问有权访问执行环境的变量和函数。说到这里,大家可能有点懵,那我们就用一些代码和图片来解释一下吧。//windowscopevarname0='scope0'
console.log(name0)//可以访问name0functionscope1(){
varname1='scope1'
console.log(name0,name1)//这里youcanaccessname0,name1functionscope2(){varname2='scope2'
console.log(name0,name1,name2)//这里可以访问name0,name1,name2 functionscope3(){varname3='scope3'
console.log(name0,name1,name2,name3)//这里可以访问name0,name1,name2,name3}}}JS解释器执行这段代码的时候,会得到四个执行环境生成,即window、scope1、scope2、scope3。然后当JS代码执行时,每个执行环境都会被压入执行栈,并生成变量对象连接作用域链(从上到下)。最终生成的作用域链为:window→scope1→scope2→scope3对于执行环境中的每一个变量对象,其作用域链都是其native加上其前一个变量对象(例如scope2的作用域链为scope2及其前一个scope1和窗户)。前面我们说过,每个执行环境中的变量对象是指执行环境可以访问变量和函数。个人理解,这个函数是变量对象作用域链上的其他变量对象,所以很好理解。我们分析一下上面代码中scope2的变量对象上有什么,首先是参数数组(arguments,这里是[])和name2变量,然后是scope1的变量对象和全局变量对象。说了那么多,提到了那么多概念和名词,我们好像只讲了作用域链,没有讲作用域。这不是废话吗!!!!好吧,现在让我们谈谈范围。我们先来分解一下概念。每个执行环境都可以通过作用域链向上访问其作用域链的其他执行环境,但不能向下访问。这是范围。..我们以scope2函数为例。他可以访问name2、name1和name0,但不能访问name3。这是范围限制。他只能访问scope1和window(以及它自己)的执行环境。呃,就这么短的一段话,我自己也醉了,不过我个人认为作用域也就那么回事,关键是对执行环境、变量对象和作用域链的理解。这些是深入理解Javascript作用域的关键。其实说到这里,我觉得差不多了。第一次写这么长的博文。文章水平还有待提高。嗯,所以我加了一些个人的理解,写了这篇博客。非常希望有深入了解WEB开发的朋友多多批评指正。