2.1 变量作用域
2.2 变量提升
function hoisted() {
console.log(v);
var v = 1; //声明会被提升到它所在函数的顶部,并被赋予undefined值
}
==>
function hoisted() {
var v;
console.log(v);
v = 1;
}
2.3 高级变量提升和执行环境对象
底层发生了什么呢?
提升:JavaScript引擎在进入作用域时,会对代码分两轮处理。第一轮,初始化变量;第二轮,执行代码。
执行环境由函数在执行时发生的所有事物组成。这和函数声明是分离的,因为函数声明描述了当函数执行的时候会发生什么事情。执行环境是指函数的执行。
在<script>内的所有东西都在全局执行环境中。
2.4 作用域链
主要限制在全局和局部的范围内。JavaScript有一种和作用域链类似的概念,称为原型链。
2.5 JavaScript对象和原型链
JavaScript对象是基于原型的,而当今其他广泛使用的语言全部都使用基于类的对象。在基于类的系统中,对象是这样定义的:使用类来描述它是什么样的。在基于原型的系统中,我们创建的对象,看起来要像我们想要的所有这种类型的对象那样,然后告诉JavaScript引擎,我们想要更多像这样的对象。打个意思相近的比方,如果建筑是基于类的系统,则建筑师会先画出房子的蓝图,然后房子都按照该蓝图来建造。如果建筑是基于原型的,建筑师会先建一所房子,然后将房子都建成像这种模样的。
原型链:
2.6 函数---更深入的窥探
函数是JavaScript中的第一类对象。它们可以保存在变量中,可以有属性甚至可以作为参数传给调用函数。它们用于控制变量作用域以及提供私有变量和方法。
函数是一个对象。
不想第三方库共享它们的内部变量,可以把整个程序封装在函数中,调用这个函数,这样外部代码就不能访问到变量了。
自执行函数:没有函数名,用来控制变量的作用域,阻止变量泄漏到代码中的其他地方。
闭包:阻止垃圾回收器将变量从内存中移除的方法,使得在创建变量的执行环境的外面能够访问到该变量。
闭包是如何工作的?