JS的作用域链
JavaScript词法性质作用域
简而言之就是,在JavaScript中,函数的作用域在编译时期就已经确定下来了,而不是取决于他的执行位置
var num = 10;
function method1() {
console.log(num);
}
function method2() {
var num = 20;
method1();
}
method2();//输出10
上边这个例子就印证了这一点,method1和method2都处于全局作用域当中,尽管method2的局部作用域中也存在变量num,method1在执行时会优先读取全局作用域中的变量num,所以method2的执行结果为10
代码块中的作用域
页面中可以放置多个<script>标签,每一个<script>标签被称作一个代码块,代码块之间可以相互访问(确切的说不完全是),当某一个代码块中出现了报错之后,这个代码块当中错误之后的代码不会再执行,但不影响这个代码块之后其他代码块的执行。
<script>
var b = 22;
console.log("first");
console.log(a); //a is not defined
var c = 33;
</script> <script>
console.log("second");
console.log(a); //undefined
console.log(b); //
console.log(c); //undefined
var a = 12;
</script>
不同代码块在编译的时候预解析时,会把变量声明和函数声明提前到当前代码块的顶部,与其他代码块不互通
根据预解析的原则,在代码块first运行时,a的声明在代码块second中,所以此时会报a is not defined错,此后的代码也不再被执行。代码块second运行时,a只被声明没有被赋值,所以是undefined;b在first代码块中已经完成了赋值操作,所以可以被正常输出22;c在first代码块中预解析时只被声明,赋值操作没有执行所以输出undefined
自执行函数
在我的理解里,自执行函数最主要的作用就是创建一个私有的局部作用域,以此来减少与上一层作用域中的变量冲突,因为在外部作用域中不能去访问自执行函数中变量或者方法。额外补充的是,今天了解到不只是()()的形式会形成自执行函数,!、+、-、×、/甚至逗号等运算符都可以形成自执行函数,本质是将函数声明转换为函数表达式,详细可以看http://www.cnblogs.com/jkj-jim/p/6374139.html
JS的作用域链的更多相关文章
- JS 之作用域链和闭包
1.JS无块级作用域 <script> function Main(){ if (1==1){ var name = "alex"; } console.log(nam ...
- js中作用域链的问题
为什么没有var声明的变量是全局的? 是因为,在js中,如果某个变量没有var声明,会自动到上一层作用域中去找这个变量的声明语句,如果找到,就使用,如果没有找到,继续向上查找,一直查找到全局作用域为止 ...
- JS的作用域链与this指向
JS的作用域链是在函数创建时创建的.而this对象是在函数运行期间绑定的. 下面看几个例子,说明JS的作用域链和this是两套分离的链. 1) var name = 'window下的name< ...
- JS的作用域链与原型链
来一波,好记性不如烂笔头. 这两条链子可是很重要的. 作用域链 当执行一段JS代码(全局代码或函数)时,JS引擎会创建为其创建一个作用域又称为执行上下文(Execution Context),在页面加 ...
- 浅谈JS的作用域链(一)
JS的执行环境 执行环境(Execution context,EC)或执行上下文,是JS中一个极为重要的概念. 在JavaScript中有三种代码运行环境: Global Code JavaScrip ...
- 深入理解JS函数作用域链与闭包问题
function fun(n,o) { console.log(o) return { fun:function(m){ return fun(m,n); } }; } ); a.fun(); a.f ...
- js之作用域链到闭包
一.作用域 全局作用域和函数作用域(局部作用域). 一个变量的作用域就是源代码中定义这个变量的区域. 二.作用域链和闭包 全局变量只有一个(window,globel),全局环境下每一个函数都会形成一 ...
- 浅谈JS的作用域链(三)
前面两篇文章介绍了JavaScript执行上下文中两个重要属性:VO/AO和scope chain.本文就来看看执行上下文中的this. 首先看看下面两个对this的概括: this是执行上下文(Ex ...
- 浅谈JS的作用域链(二)
上一篇文章中介绍了Execution Context中的三个重要部分:VO/AO,scope chain和this,并详细的介绍了VO/AO在JavaScript代码执行中的表现. 本文就看看Exec ...
- js高级-作用域链
作用域链存放的就是 VO AO 参数 变量 等
随机推荐
- 小程序navigateBack,子页面传值给父页面
子页面 let page = getCurrentPages(); let prevPage = page[page.length - 2]; prevPage.setData({ lxr :item ...
- 使用gitblit搭建git服务器
前言 一直在学习新技术,我想都整理到博客上.公司还在坚持用svn,之前学过git都快要忘记了,此篇博客记录搭建基于gitblit的git服务器.当然直接使用linux也可以,不过我不是很熟悉,考虑到我 ...
- js异步处理历程
为什么会出现异步: js执行环境是单线程的,异步处理就非常重要. 处理的方法: 方法一:callback hell 解决:解决了异步处理 存在问题:出现多个回调函数嵌套,代码就会比较乱,出现回调地狱现 ...
- 树莓派(Raspberry Pi 3)安装centos7后yum无法使用解决办法
树莓派(Raspberry Pi 3)安装centos7后yum无法使用解决办法 人穷,闲鱼淘了个二手的树莓派3 英国版,无奈咱也不会用,很无奈~ 安装教程百度到的差不多都可以,找个格式正常的一步一步 ...
- [SQL][MS SQL]ID自增列从1开始重新排序
数据库中把ID自增长重置成1: 一般做法:(太麻烦) 复制表数据->删除原表.新建一张表->粘贴: 新方法: 数据库中:新建查询->复制.粘贴一下代码->修改表名,执行即可(先 ...
- 嵌入式文件IO实验
实验步骤: 1.arm-linux-gcc 交叉编译环境的安装.参考网站:https://jingyan.baidu.com/article/9c69d48f80282013c9024e20.html ...
- scala 读取保存文件 去除字符特殊
/** * 读取文件 * @param filename * @return */ def readFormFile(filename: String) = { var ooop = "&q ...
- Cannot forward to error page for request ......
今天现场报了以下问题: Cannot forward to error page for request [/order/search] as the response has already bee ...
- WordCount编码实现及单元测试(第二次作业)
项目码云地址:https://gitee.com/zhujunlin/wc.git 一.题目思路 ========== 阅读完题目要求之后我很懵,因为之前从未使用过博客园和码云工具,对编程的目标需求也 ...
- CPU TFLOPS 计算
CPU TFLOPS 计算 姚伟峰 yaoweifeng0301@126.com] http://www.cnblogs.com/Matrix_Yao/ 深度学习任务是一个计算密集型任务,所以很关注计 ...