函数的作用域是什么

函数作用域的含义是指,属于这个函数的全部变量都可以在整个函数的范围内使用及复用(事实上在嵌套的作用域中也可以使用)。这种设计方案是非常有用的,能充分利用 JavaScript 变量可以根据需要改变值类型的“动态”特性。

变量的作用域无非就是两种:全局变量和局部变量。 

全局作用域: 

最外层函数定义的变量拥有全局作用域,即对任何内部函数来说,都是可以访问的:

局部作用域: 

和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,而对于函数外部是无法访问的,最常见的例如函数内部

作用域链(Scope Chain)

那什么是作用域链? 

我的理解就是,根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问。 

想要知道js怎么链式查找,就得先了解js的执行环境

执行环境(execution context)

每个函数运行时都会产生一个执行环境,而这个执行环境怎么表示呢?js为每一个执行环境关联了一个变量对象。环境中定义的所有变量和函数都保存在这个对象中。 

全局执行环境是最外围的执行环境,全局执行环境被认为是window对象,因此所有的全局变量和函数都作为window对象的属性和方法创建的。 

js的执行顺序是根据函数的调用来决定的,当一个函数被调用时,该函数环境的变量对象就被压入一个环境栈中。而在函数执行之后,栈将该函数的变量对象弹出,把控制权交给之前的执行环境变量对象。 

闭包

闭包有两个作用: 

第一个就是可以读取自身函数外部的变量(沿着作用域链寻找) 

第二个就是让这些外部变量始终保存在内存中 

varouterVar ="outer";functionfn(){console.log(outerVar); } fn();//result:outervarouterVar ="outer";functionfn(){console.log(outerVar); } fn();//result:outer

varouterVar ="outer";functionfn(){console.log(outerVar); } fn();//result:outer

varouterVar ="outer";functionfn(){console.log(outerVar); } fn();//result:outer

varouterVar ="outer";functionfn(){console.log(outerVar); } fn();//result:outervarouterVar ="outer";functionfn(){console.log(outerVar); } fn();//result:outer

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 我清楚的记得那个星期天,阳光很大,我一早就起了床,到你指定的地方等你,其实在这之前我没坐过地铁,我最担心的就是走错...
    穆炎阅读 1,885评论 0 1
  • ① 恍如隔世的感觉,雾霾霾的通道,天空突然亮起来,不知如何到了印度,随行还有几人,记不起容...
    珍珍呀珍珍Zz阅读 1,040评论 0 1
  • 天下没有十全十美的商品,每个房子客户都能挑出毛病,而顶尖的高手,会真诚地告诉客户房屋的缺点! 顶级带看思路:坦诚相...
    e5195964eb9b阅读 1,547评论 0 1