js的变量提升

js的变量提升

找到所有的var关键字,把var的执行,提升到作用域顶端,也就是var声明提前了,但是赋值还是在原地。例如:

console.log(a);   //undefined
var a=10;
console.log(a);   //10

执行过程变成了如下:

var a;
console.log(a);
 a=10;
console.log(a);   //10
let中不存在变量提升
// var 的情况
console.log(foo); // 输出undefined
var foo = 2;
// let 的情况
console.log(bar); // 报错ReferenceError
let bar = 2;
声明会提升到作用域顶端
a = 1;
var a;
console.log(a); //1

当在函数作用域中操作一个变量的时候,会先在自身作用域中查找,如果有就直接使用,如果没有就向上级作用域中寻找。如果全局作用域中也没有,那么就报错。

根据内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称为函数作用域链

作用域链的原则:就近原则

    console.log(v1);
        var v1 = 100;
        function foo() {
            console.log(v1);
            var v1 = 200;
            console.log(v1);
        }
        foo();
        console.log(v1);
js中var的变量和function的函数名重名时的执行结果

如果var的变量和function的函数名重名时,var的优先级更高,先执行var,按照var划分区域,但是遇到function,function会直接占用,也就是说最终执行function

   console.log(a);  //f a(){}
   var a=10;
   function a(){
   };
   console.log(a); //10

执行过程如下:

   var a;
   function a(){
   };
   console.log(a);  //f a(){}
    a=10;
   console.log(a); //10
声明式函数是整体提升
 	   fn(); //hello
        function fn() {
            console.log("hello");
        };
        fn(); //hello

执行过程如下:

   function fn(){
       console.log("hello");
   };

   fn();
   fn();
请用今天的努力,让明天没有遗憾。
原文地址:https://www.cnblogs.com/cupid10/p/12793196.html