十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
ES6 之前 JS 没有块级作用域。例如
创新互联专业成都做网站、成都网站建设,集网站策划、网站设计、网站制作于一体,网站seo、网站优化、网站营销、软文营销等专业人才根据搜索规律编程设计,让网站在运行后,在搜索中有好的表现,专业设计制作为您带来效益的网站!让网站建设为您创造效益。
从上面的例子可以体会到作用域的概念,作用域就是一个独立的 地盘 ,让变量不会外泄、暴露出去。上面的name就被暴露出去了,因此, JS 没有块级作用域,只有全局作用域和函数作用域 。
全局作用域就是最外层的作用域 ,如果我们写了很多行 JS 代码,变量定义都没有用函数包括,那么它们就全部都在全局作用域中。这样的坏处就是很容易撞车、冲突。
这就是为何 jQuery、Zepto 等库的源码,所有的代码都会放在 (function(){....})() 中。因为放在里面的所有变量,都 不会被外泄和暴露 ,不会污染到外面,不会对其他的库或者 JS 脚本造成影响。这是函数作用域的一个体现。
附:ES6 中开始加入了块级作用域,使用let定义变量即可,如下:
首先认识一下什么叫做 自由变量 。如下代码中,console.log(a)要得到a变量,但是在当前的作用域中没有定义a(可对比一下b)。当前作用域没有定义的变量,就称为 自由变量 。自由变量如何得到 —— 向 父级 作用域寻找。
如果父级也没呢? 再一层一层向上寻找,直到找到全局作用域还是没找到,就宣布放弃 。这种一层一层的关系,就是 作用域链 。
通过例子来理解闭包。
自由变量将从作用域链中去寻找,但是 依据的是函数定义时的作用域链,而不是函数执行时 ,以上这个例子就是闭包。闭包主要有 两个 应用场景:
1.函数 作为 返回值 ,上面的例子就是
2.函数 作为 参数 传递,看以下例子
[img]在ES6以前,js一般只有全局作用域和函数作用域(ES6新增了块级作用域)。全局作用域的链表不用多说,就是包括了所有的全局变量和window的属性(浏览器环境下)。函数作用域链简单的说就是在该函数内部,能够访问到的所有变量的集合链表,包括所有的全局变量、函数内部的局部变量,如果有外层函数的话,还包括外层函数定义的变量。
JavaScript中所有的量都是存在于某一个作用域中的
除了全局作用域, 每一个作用域都是存在於某个作用域中的
在试图访问一个变量时JS引擎会从当前作用域开始向上查找直到Global全局作用域停止
例如
var A;//全局作用域
function B()
{
var C;//C位于B函数的作用域
function D()
{
var E;//E位于D函数的作用域
alert(A)
}
}
当alert(A)时, JS引擎沿着D的作用域, B的作用域, 全局作用域的顺序进行查找.
这三个作用域组成的有序集合就成为作用域链
至于为什么叫链, 你可以理解和链表有相似之处, 深层的作用域会能够访问到上层作用域, 就如同链表中两个连续节点能够单向访问一样
最近在学习JavaScript的过程中,先由明了,再到困惑,现在又步入了明了的阶段。
那么就说说原型链和作用域链的问题,刚学习的时候,这两者是分开学的,并没有
在这两者之间有困扰,但是当回过头来综合学习的时候,却在这两者之间产生了困惑,
后来经过学习,发现原来这两者完全属于不同的范围,只不过名字相似而已,发生
困惑的就是他们寻找目标的方式几乎一样,都是有链顶到链尾的顺序。
其实区分他们的关键就是,作用域链的目的是用来寻找变量的机制,而原型链是进行
对象属性的查找的机制。之所以发生困惑,是因为很多教程上都有这么一句话:其实
全局变量就是全局对象的属性,这句话本身并没有错,在这个意义上来说确实一样,但
这也容易让我们发生迷惑。
总之,javascript中作用域链是变量的查找机制,而原型链是对象属性的查找机制,分清
即可