引出
今天做题的时候遇到了以下两道题,觉得蛮有意思的。同时也通过这两道题引出var a=b=1;和 var a=1,b=1;的区别,来加深对var a=b=1;和 var a=1,b=1;的理解。
你是不是跃跃欲试了?快来开动脑筋吧~~~
第一道:
console.log(a, b);
var a = 1, b = 1;
function fn() {
console.log(a, b);
var a = b = 2;
console.log(a, b);
}
fn();
console.log(a, b);
第一道答案:
第二道:
var a=1,b=1;
function fn(){
console.log(a,b);
var a=b=2;
console.log(a,b);
}
fn();
console.log(a,b);
第二道答案:
涉及知识点
变量提升、函数提升、隐式全局变量、var a=b=1;和 var a=1,b=1;的区别、js中变量查找顺序
var a=b=1;等价于 var a=1;b=1;
var a=1,b=1;等价于 var a=1;var b =1;
变量提升和函数提升:
变量提升和函数提升是JavaScript中的两个概念,它们描述了在代码执行之前,变量和函数声明会被提升到其所在作用域的顶部的行为。
变量提升是指在变量声明之前就可以访问其变量。JavaScript引擎在代码执行之前会扫描整个作用域,将变量声明提升到作用域的顶部,但是不会提升变量的赋值操作。函数提升类似于变量提升,但是是针对函数声明的。JavaScript引擎在代码执行之前会将函数声明提升到作用域的顶部。
隐式全局变量:
在JavaScript中,如果在声明变量时没有使用`var`、`let`或`const`关键字,那么这个变量就会成为隐式全局变量。隐式全局变量会被绑定到全局对象(在浏览器环境中是`window`对象)上,可以在任何地方被访问和修改。
关于JavaScript中的变量查找方式,它是基于词法作用域的。当访问一个变量时,JavaScript引擎会按照以下步骤进行查找:
1. 在当前作用域查找变量名。
2. 如果找到了变量,则使用它。
3. 如果没有找到变量,则向上一级作用域查找,直到找到该变量或者达到全局作用域(即全局对象)。
4. 如果仍然没有找到变量,则报错该变量未定义。
详解
第一道:
console.log(a, b);
var a = 1, b = 1;
function fn() {
console.log(a, b);
var a = b = 2;
console.log(a, b);
}
fn();
console.log(a, b);
根据变量提升、函数提升、var a=b=1;和 var a=1,b=1;的区别,以及函数提升的优先级高于变量提升的原则,我们可以得出上述代码的等价代码:
验证写的等价代码与源代码运行结果一致,说明等价代码正确
具体分析如下图
第二道类似就不过多讲解了
总结
1、var a=b=1;等价于 var a=1;b=1;
var a=1,b=1;等价于 var a=1;var b =1;
2、函数提升优先级高于变量提升
3、变量提升和函数提升只是提升声明
4、隐式全局变量可以在任何地方被访问和修改。