变量的作用域也是前端面试题常考的一个问题,掌握下面几个规律可以帮你更好的理解js的作用域。
1.作用域优先级遵循就近原则,函数内部的作用域优先级大于外部
var a=456;
var b=111;
function fn () {
var a=123;
a=798;
console.log(a); //输出789
console.log(b); //输出111
} fn();
2.变量预处理(预解析),当你写了一个变量,并且赋值,期间发生了两个过程
a.先声明一个变量,然后把声明语句放到当前作用域的最前面(此过程称为变量提升)
b.赋值语句还在原先位置,然后进行赋值。
function fn () { console.log(a); //输出undefined var a=123; } fn();
以上语句相当于下面这个语句,因为a赋值在输出语句后面,没有赋值,所以值是undefined。
function fn () {
var a; console.log(a); //输出undefined a=123; } fn();
3. 如果理解了上面两点,你就会知道为什么你写了一个函数,不管在什么位置你总是能调用,而不是得到undefined
看看下面这两个函数的区别
fn2(); //输出 "函数声明"
fn3(); //报错(意思是函数没有定义) "Uncaught TypeError: undefined is not a function" function fn2 () {
console.log("函数声明");
} var fn3 = function () {
console.log("函数表达式");
}
这就是我对js作用域的一点见解,希望可以帮助你理解。