你不知道 javascript上卷第一部分第二,三,四章

256 阅读2分钟

词法作用域的理解

大部分的编译器第一阶段就是词法阶段(词法分析阶段),对字符进行分析
而词法作用域就是这阶段的作用域
也就是该块级作用域

私有成员变量

将变量定义在某个函数内部,仅内部使用
相当于将变量隐藏了起来,而且变量不会污染全局变量或者说上级变量
但是函数隐藏变量有两个缺点

1.变量名污染所在作用域
2.必须显式地调用函数名

解决这两个问题的方法就是立即执行函数 不仅仅不会变量污染还会立即执行不需要显式调用

变量和函数提升

提升是先调用再声明
实际效果如

console.log(a);
var a = 2;

等效于
var a;
console.log(a);

尽管变量或者函数被提升了,但是其他的操作和逻辑依然停留再原来的位置
这样会导致一些错误的发生,函数提升时,函数内部程序正常执行,但是变量可能由于执行顺序的问题可能会改变
函数提升只存在与函数声明,不存在与函数表达式

还有一点较为有意思的是,函数声明的优先级要高于函数表达式(部分面试题出现过)

foo();
function foo(){
    console.log("函数声明")    
}
var foo = function(){ //不能用let,let不能重命名存在的函数
    console.log("函数表达式")
}
最后输出"函数声明",而并非是顺序执行下来的函数表达式

对提升的理解

引擎的两个阶段
1.编译阶段
找到变量的声明
2.执行阶段
对变量进行赋值判断之类对操作

所以在执行之前,变量和函数已经给找到并且提升到执行之前了,这就是函数和变量的提升