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的作用域链的更多相关文章

  1. JS 之作用域链和闭包

    1.JS无块级作用域 <script> function Main(){ if (1==1){ var name = "alex"; } console.log(nam ...

  2. js中作用域链的问题

    为什么没有var声明的变量是全局的? 是因为,在js中,如果某个变量没有var声明,会自动到上一层作用域中去找这个变量的声明语句,如果找到,就使用,如果没有找到,继续向上查找,一直查找到全局作用域为止 ...

  3. JS的作用域链与this指向

    JS的作用域链是在函数创建时创建的.而this对象是在函数运行期间绑定的. 下面看几个例子,说明JS的作用域链和this是两套分离的链. 1) var name = 'window下的name< ...

  4. JS的作用域链与原型链

    来一波,好记性不如烂笔头. 这两条链子可是很重要的. 作用域链 当执行一段JS代码(全局代码或函数)时,JS引擎会创建为其创建一个作用域又称为执行上下文(Execution Context),在页面加 ...

  5. 浅谈JS的作用域链(一)

    JS的执行环境 执行环境(Execution context,EC)或执行上下文,是JS中一个极为重要的概念. 在JavaScript中有三种代码运行环境: Global Code JavaScrip ...

  6. 深入理解JS函数作用域链与闭包问题

    function fun(n,o) { console.log(o) return { fun:function(m){ return fun(m,n); } }; } ); a.fun(); a.f ...

  7. js之作用域链到闭包

    一.作用域 全局作用域和函数作用域(局部作用域). 一个变量的作用域就是源代码中定义这个变量的区域. 二.作用域链和闭包 全局变量只有一个(window,globel),全局环境下每一个函数都会形成一 ...

  8. 浅谈JS的作用域链(三)

    前面两篇文章介绍了JavaScript执行上下文中两个重要属性:VO/AO和scope chain.本文就来看看执行上下文中的this. 首先看看下面两个对this的概括: this是执行上下文(Ex ...

  9. 浅谈JS的作用域链(二)

    上一篇文章中介绍了Execution Context中的三个重要部分:VO/AO,scope chain和this,并详细的介绍了VO/AO在JavaScript代码执行中的表现. 本文就看看Exec ...

  10. js高级-作用域链

    作用域链存放的就是 VO  AO 参数 变量 等

随机推荐

  1. solr中facet及facet.pivot理解(整合两篇文章保留参考)

    Facet['fæsɪt]很难翻译,只能靠例子来理解了.Solr作者Yonik Seeley也给出更为直接的名字:导航(Guided Navigation).参数化查询(Paramatic Searc ...

  2. 001.[python学习]写在前面的

    0.多动手写写也许你所说的问题就不是问题: 1.最好的帮助文档是dir和help,如下图: 2.如果为了快速完成任务可以选择IDE,否则尽量不要依赖它,因为它的智能导致自己的无能: 3.也许有其他语言 ...

  3. C# winform三种方法判断文本框textBox内容是否为空

    使用系统API函数,需要使用命名空间:System.Runtime.InteropServices: 1.if (textBoxPath.Text ==  String.Empty ) 2.if (t ...

  4. 树——B-树

    B树的定义: 1.若根结点不是终端结点,则至少有2棵子树 2.每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m 3.每一个叶子节点都包含k-1个元素,其中 m/2 ...

  5. Webpack 使用url-loader和file-loader打包资源文件

    在js中不仅可以通过import引入js文件,还可以引入图片.视频等资源文件,这样webpack打包时就会把所引入的资源文件也一起打包进来 打包进来的文件会返回一个字符串:即文件的路径 要做到这一点, ...

  6. assert (boxes[:, 2] >= boxes[:, 0]).all()报错

    根据报错信息,打印以下内容: 代码如下: for i in xrange(num_images): #print ('in append_flipped==================',self ...

  7. JAVA设计方法思考之如何实现一个方法执行完毕后自动执行下一个方法

    今天编程时,突然想起来在一些异步操作或Android原生库的时候,需要我们实现一些方法, 这些方法只需要我们具体实现,然后他们会在适当的时候,自动被调用! 例如AsyncTask,执行玩doInBac ...

  8. html:布局class名和其他class名个人整理总结

    一:app 二:header 三:main 四:footer 1:中横杠:布局(main-top.main-left等) 2:下横杠:状态(item-active:选中等)

  9. redis伪集群脚本

    #安装redis伪集群脚本,先把redis-..gem及启动脚本放在/data1/redis-cluster目录下,然后执行该脚本即可 #!/bin/bash set -e #获取redis本机ip ...

  10. ExtJS4.2下将表单元素放在菜单时不能进行拷贝的问题解决办法

    通过浏览器F12我们发现,在菜单对应的dom元素上面,有几个系统附加的事件处理函数,只要我们将它去掉就可以了.示意代码如下: { xtype: "button", scope: z ...