作用域和闭包
1.什么是作用域
一套设计良好的规则,用来存储变量,并且可以方便地找到这些变量,这套规则被称为作用域
作用域嵌套:
当一个块或者函数嵌套在另一个块或者函数中,就发生了作用域的嵌套;
在当前作用域中无法找到某个变量时,引擎会在外层嵌套的作用域中继续查找,直到找到该变量,或者抵达最外层作用域(即全局作用域)为止;
2.词法作用域
词法作用域就是定义在词法阶段的作用域。换句话说,词法作用域是在写代码时将变量或者块作用域写在哪里决定的,因此当词法分析器处理代码时会保持作用域不变。
作用域查找会再找到第一个匹配的标识符时停止;
eval(...)和with可以欺骗词法作用域
3.函数作用域和块作用域
属于这个函数的全部变量都可以在整个函数的范围内使用及复用。
let关键字可以将变量绑定到所在的任意作用域中。即let为其声明的变量隐式地劫持了所在的块作用域。
const可以用来创建块作用域变量,但其值是固定的(常量)。
4.变量提升
变量和函数声明好像被从它们在代码中出现的位置被移动到了最上面,这个过程就叫作提升。
我们习惯将var a = 2;看做一个声明就,而实际上JavaScript引擎会将 var a和a = 2当做两个单独的声明,第一个是编译阶段的任务,第二个是执行阶段的任务。
无论作用域中的声明出现在什么地方,都将在代码本身被执行前首先进行处理,可以想象成所有的声明(变量和函数)都会被“移动”到各自作用域的最顶端,这个过程被称为提升。
声明本身会被提升,而包括函数表达式的赋值在内的赋值操作并不会提升。
5.作用域闭包
当函数可以记住并访问所在词法作用域,就产生了闭包,即使函数是在当前词法作用域之外执行。
函数对象可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数作用域内,这种特性被称为“闭包“ --《JavaScript权威指南》
function foo(){
var a = 2;
function bar(){
console.log(a);
}
return bar;
}
var baz = foo();
baz(); //2 这就是闭包的效果
this和对象原型
1.关于this
this实际上是在函数被调用时发生的绑定,它指向什么完全取决于函数在哪里被调用
2.this全面解析
3.对象
4.混合对象类
5.原型
6.行为委托
持续更新中......
网友评论