谈谈我对JavaScript原型和闭包系列理解(随手笔记9)

 更新时间:2015年12月24日 09:39:20   作者:Infinity_June  
这篇文章主要介绍了谈谈我对JavaScript原型和闭包系列理解(随手笔记9)的相关资料,需要的朋友可以参考下

相关阅读:谈谈我对JavaScript原型和闭包系列理解(随手笔记6)   谈谈我对JavaScript原型和闭包系列理解(随手笔记8)

作用域

引用《JavaScript语言精粹和编程实践》上对作用域的定义:

变量作用域又叫变量的可见性。变量作用域完成对信息的隐蔽,也就是处理“割据”问题。

js中是没有块级作用域的(ES6中有一个let,可以在{},if,for里面声明,同时作用域限定在块级。let声明的变量不存在变量提升!这里不谈论这个,因为我也是偶然看到。)。

我们在编写代码的时候,不要在“块”里面声明变量,应该在代码的一开始就声明好,以避免发生歧义。

 for(var i = 0; i < 10; i++) { //不好的声明方式
 //...
}
console.log(i);
/*----------------------------------------------*/
var i = 0; //好的声明方式
for(i = 0; i < 10; i++) {
 //....
}
console.log(i); 

javascript除了全局作用域之外,还有一个函数作用域。

 我们在声明变量的时候,全局代码在最前端声明,函数中声明变量要在函数体前面声明。同时,声明变量的时候必须用"var"操作符。

 var a = 10,  //全局作用域
 b = 20;
function fn() { //fn函数作用域
 var a = 100,
  c = 300;
 function bar() { //bar函数作用域
  var a = 1000,
   d = 4000;
 }
} 

全局代码、fn函数和bar函数都会形成一个作用域。作用域有上下级关系,上下级关系是看函数在哪个作用域下创建的。fn函数作用域下创建了bar函数,"fn函数作用域"就是"bar函数的作用域"的上级。

作用域的最大用处就是隔离变量,不同作用域下同名变量不会有冲突

--------------------------------------------------------------------------------

作用域在函数定义的时候就已经确定了,而不是函数调用的时候确定。

 

1、程序在加载的时候就已经确定了全局上下文环境,并随着程序的执行而对变量就行赋值。

 

2、执行到36行,调用fn(10),创建fn函数的执行上下文环境,压栈,并将此上下文设置为活动状态。

 

3、执行到32行,调用bar(100),创建bar(100)函数的执行上下文环境,压栈,并将此上下文设置为活动状态。

 

4、bar(100)调用完毕,出栈,bar(100)函数上下文环境被销毁。接着执行33行,调用bar(200),创建bar(200)函数的执行上下文环境,压栈,并将此上下文设置为活动状态。

 

5、bar(200)调用完毕,出栈,其上下文环境被销毁。此时的控制权交给了fn(10)上下文环境,其再次变为活动状态。

 

6、此时fn(10)调用完毕,出栈,其上下文环境被销毁。控制权交给了全局执行上下文环境。

 

到这里这一段代码的执行过程就跑完了。

然后借用一下原作者的完整图:

总结:

作用域只是一个“地盘”,要通过作用域对应的执行上下文环境来获取变量的值。同一个作用域下,不同的调用会产生不同的执行上下文环境,继而产生不同的变量的值。所以,作用域中变量的值是在执行过程中产生的确定的,而作用域却是在函数创建时就确定了。所以,如果要查找一个作用域下某个变量的值,就需要找到这个作用域对应的执行上下文环境,再在其中寻找变量的值。

相关文章

  • JavaScript 通过Ajax 动态加载CheckBox复选框

    JavaScript 通过Ajax 动态加载CheckBox复选框

    本文通过实例代码给大家介绍了JavaScript 通过Ajax 动态加载CheckBox复选框的方法,需要的朋友参考下吧
    2017-08-08
  • 纯JS半透明Tip效果代码

    纯JS半透明Tip效果代码

    自己根据网上提供的一个透明功能类库写的纯JS半透明Tip效果
    2008-10-10
  • 教你如何写出可维护的JS代码

    教你如何写出可维护的JS代码

    在平时工作开发中,大部分开发人员都花费大量的时间在维护其他人员的代码。很难从头开始开发新代码,很多情况下都是以他人成果为基础的,或者新增修改需求,自己写的代码也会被其他开发人员调用,所以写好一份高质量可维护的代码就显得十分重要。
    2021-05-05
  • 深入理解JS中attribute和property的区别

    深入理解JS中attribute和property的区别

    property 和 attribute非常容易混淆,但实际上,二者是不同的东西,属于不同的范畴,本文就详细的介绍一下JS中attribute和property的区别 ,感兴趣的可以了解一下
    2022-02-02
  • ES5 ES6中Array对象去除重复项的方法总结

    ES5 ES6中Array对象去除重复项的方法总结

    这篇文章主要给大家介绍了Array对象去除重复项的相关资料,文中通过示例代码详细介绍了在ES5和ES6中Array对象去除重复项的方法,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-04-04
  • javascript框架设计读书笔记之数组的扩展与修复

    javascript框架设计读书笔记之数组的扩展与修复

    本文是司徒正美的《javascript框架设计》的第三章第2节的读书笔记,本节主要介绍的是javascript数组的扩展与修复,本文则是选取了其中的重点部分展示给大家。
    2014-12-12
  • javascript淘宝主图放大镜功能

    javascript淘宝主图放大镜功能

    这篇文章主要为大家详细介绍了javascript淘宝主图放大镜功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • 有效提高JavaScript执行效率的几点知识

    有效提高JavaScript执行效率的几点知识

    这篇文章主要介绍了有效提高JavaScript执行效率的几点知识,本文从JavaScript函数、JavaScript作用域、JavaScript字符串、JavaScript DOM操作、DOM重绘、DOM访问、DOM遍历等方面讲解了提高JavaScript执行效率的小技巧,需要的朋友可以参考下
    2015-01-01
  • 对layui中table组件工具栏的使用详解

    对layui中table组件工具栏的使用详解

    今天小编就为大家分享一篇对layui中table组件工具栏的使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • 微信小程序 搜索框组件代码实例

    微信小程序 搜索框组件代码实例

    这篇文章主要介绍了微信小程序 搜索框组件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09

最新评论