js作用域和内存
对于一本编程语言来讲,个人认为,最基本的就是存储,在存储,读取,计算值的时候是按照一定的规则来操作,这套规则呢就叫做作用域。
值保存,读取,的时候需要一个范围,如果以按照函数为单位的话就做函数作用域,按照模块的话就叫做模块作用域。作用域是可以相互嵌套的。
js作为一本编译语言,需要两个过程,一个是编译另一个呢就是运行。而编译大致分为两个部分,1,词法与语法分析(编译) 2,代码生成的过程。
编译时在打开浏览器的一瞬间进行的,js对编译做了优化,举个例子说一下,js编译过程。
var a=123;
首先打开一个页面后,加载了js,创建了一个全局作用域,相当于建立了一个酒店,就是编译的第一个步骤,进入到了词法与语法分析,通过词法与语法分析,可以分辨出哪些时语句哪些是运算符哪些时数据类型,在这个过程中,如果发现了声明语句,也就是var,解释器就会询问当前的作用域,也就是询问这个酒店,是否有这个变量a,如果有会忽略,如果没有,会创建一个变量a,并且分配一定的内存空间,就相当于你接到了一个客人,让这个客人入住到酒店,这个过程就是编译的过程,编译后就会生成一段代码,就是你后面要运行的代码,这也解释了声明语句提前的原因。当声明是一个函数的时候,和前面一样,但同时会新创建一个作用域,相当于你入住酒店,把你安排在哪一层,创建一个新的房间。
思考一个问题,在同一个作用域下,同时声明一个变量和一个函数,而且他俩重名,这个时候解释器如何处理?
答案是:当前作用域下,函数会覆盖变量。
作用域可以嵌套,不可以重叠。
在编译阶段,作用域是对变量函数进行存储,是存储的规则。
在代码生成的过程中(也就是函数运行中)会创建一个东西,这个东西就叫做作用域链,作用域链的作用就是对作用域中的变量和函数进行访问的,是访问的规则。会把作用域连接起来,

函数的局部环境不仅有权访问在全局环境中定义的变量和函数,而且有权访问其包含父环境,乃至全局环境。
全局环境,只能访问在全局环境中定义的变量和函数,而不能直接访问局部环境中的任何数据。
javascript没有,块级作用域,ES6中增加了。
javascript 有自动垃圾回收机制,可以手动清除,就是把变量设为null
js作用域和内存的更多相关文章
- js 作用域链&内存回收&变量&闭包
闭包主要涉及到js的几个其他的特性:作用域链,垃圾(内存)回收机制,函数嵌套,等等 一.作用域链:函数在定义的时候创建的,用于寻找使用到的变量的值的一个索引,而他内部的规则是,把函数自身的本地变量放在 ...
- js学习之变量、作用域和内存问题
js学习之变量.作用域和内存问题 标签(空格分隔): javascript 变量 1.基本类型和引用类型: 基本类型值:Undefined, Null, Boolean, Number, String ...
- 详解js变量、作用域及内存
详解js变量.作用域及内存 来源:伯乐在线 作者:trigkit4 原文出处: trigkit4 基本类型值有:undefined,NUll,Boolean,Number和Strin ...
- JS变量、作用域、内存
写到这个题目<JS变量.作用域,内存>,我就不由自主想起了黄金三嫖客.可能是名字有点像,嗯,一定是这样子的! JS接触下来,应该是要比Java简单不少的,所以,要学好啊.立个flag半年后 ...
- javascript (JS组成、书写位置、基本概念、作用域、内存问题、变量)
1 JavaScript的组成和书写位置 Javascript:运行在客户端(浏览器)的脚本语言,JavaScript的解释器被称为JavaScript引擎,为浏览器的一部分,与java没有直接的关系 ...
- Js的变量、作用域与内存
变量.作用域与内存 1 .原始值与引用值 Undefined.Null.Boolean.Number. String和Symbol.保存原始值的变量是按值(by value)访问的 引用值是保存在内存 ...
- JavaScript高级程序设计学习(三)之变量、作用域和内存问题
这次讲的主要是变量,作用域和内存问题. 任何一门编程语言,都涉及这三个. 变量,比如全局变量,局部变量等,作用域,也分全局作用域和方法作用域,内存问题,在java中就涉及到一个垃圾回收的问题,由于ja ...
- JS作用域与闭包
JS作用域与闭包 在JavaScript中,作用域是可访问变量,对象,函数的集合. 变量分为全局变量和局部变量.全局变量在函数外定义,HTML中全局变量是window对象,所有数据对象都属于windo ...
- JS作用域面试题总结
关于JS作用域问题,是面试的时候面试官乐此不疲的面试题,有时候确实是令人抓狂,今天看到一个讲解这个问题的视频,明白了那些所谓的“原理”顿时有种豁然开朗的感觉~~~ 1.js作用域(全局变量,局部变量) ...
随机推荐
- java字符串截取指定下标位置的字符串
public class A { public static void main(String[] args) { //定义的字符串 String s = "Hello World" ...
- loj.ac:#10024. 「一本通 1.3 练习 3」质数方阵
CSDN的博客 友键 题目描述 质数方阵是一个\(5×5\)的方阵,每行.每列.两条对角线上的数字可以看作是五位的素数.方格中的行按照从左到右的顺序组成一个素数,而列按照从上到下的顺序.两条对角线也是 ...
- 六、Linux的用户和组
1. 用户的管理 useradd 添加一个用户 useradd test 添加test用户 useradd test -d /home/t1 指定用户home目录 或者直接 adduser tes ...
- js 使用Math函数取得数组最大最少值
var arr = [3,1,2,6,7,8];
- 实训任务05 MapReduce获取成绩表的最高分记录
实训任务05 MapReduce获取成绩表的最高分记录 实训1:统计用户纺问次数 任务描述: 统计用户在2016年度每个自然日的总访问次数.原始数据文件中提供了用户名称与访问日期.这个任务就是要获取 ...
- C++算法之大数加法计算的代码
如下代码段是关于C++算法之大数加法计算的代码,希望对大家有用. { int length; int index; int smaller; int prefix = 0; if(NULL == sr ...
- volatile 与 JVM 指令重排序
前言: 在做单例模式时 有博客在评论区 推荐使用 volatile 关键字 进行修饰 然后用了两天时间查资料看文档 发现涉及的面太广 虽然已经了解为什么要使用 volatile + synchroni ...
- Java NIO学习之Buffer
Bufer的capacity,position和limit: capacity: 表示buffer的容量. position: 写数据到Buffer中时: 表示当前的位置.初始的position值为0 ...
- centos7 eclispe 编译C++遇到的问题总结
最近由于工作的需要,又开始回归之前已经遗忘了的技术.arm嵌入式这个古老的名词. 开始选择了linuxminit,开始的linuxminit17以前还可以,可是用了一下linuxminit19,发现r ...
- hadoop2.6.0高可靠及yarn 高可靠搭建
以前用hadoop2.2.0只搭建了hadoop的高可用,但在hadoop2.2.0中始终没有完成YARN HA的搭建,直接下载了hadoop最新稳定版本2.6.0完成了YARN HA及HADOOP ...