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 参数 变量 等
随机推荐
- JS——页面带参数跳转
#index.html window.location.href = "../home.html?value=" + rec_value; #home.html <scrip ...
- Webservice 从客户端中检测到有潜在危险的 request.form值[解决方法]
<system.web> <httpRuntime requestValidationMode="2.0" /> <pages validateReq ...
- Exp1 PC平台逆向破解 20164311
实验目标: 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getSh ...
- Timer与TimerTask
Timer和TimerTask Timer是一种定时器工具,用来在一个后台线程计划执行指定任务.它可以计划执行一个任务一次或反复多次.TimerTask一个抽象类,它的子类代表一个可以被Timer计划 ...
- centos7配置yum本地源(iso镜像)及局域网使用
2.测试环境: 服务器1:44.135.8.19(yum源) 服务器2:44.135.8.1(局域网机器) 系统:centos7.4 上传iso镜像到服务器,并挂载iso镜像 mount -t iso ...
- Android APK反编译(二)
参考:APK反编译 工具介绍 apktool 作用:资源文件获取,可以提取出图片文件和布局文件进行使用查看 dex2jar 作用:将apk反编译成java源码(classes.dex转化成jar文件) ...
- 使用 webpack 搭建多入口项目
闲来无事,学习一下怎么用 webpack 自定义多入口项目的打包 项目github地址:https://github.com/xiaoliwang2016/webpack-demo 先来看一下目录结构 ...
- wcf_first
WCF包括3部分:client(需要连接到哪里,需要调用什么),service(宿主,及其消息的公开,地址的公开),wcf服务库(提供契约名称,及其怎么干) 步骤: 1.新建wcf库,其中提供一个契约 ...
- ubuntu搭建svn服务器并htpp访问版本库并svn与web同步
Ubuntu搭建SVN服务器多版本库 1 介绍 Subversion是一个自由,开源的版本控制系统,这个版本库就像一个普通的文件服务器,不同的是,它可以记录每一次文件和目录的修改情况.这样就可 ...
- C Mergeable Stack(list超好用)
ZOJ 4016 list用法https://www.cnblogs.com/LLLAIH/p/10673068.html 一开始用普通的栈做,超内存,链表模拟栈也没写出来orz.补题发现list超 ...