479 变量提升机制

变量提升(声)

当浏览器开辟出供代码执行的栈内存后,代码并没有自上而下立即执行,而是继续做了一些事情:把当前作用域中所有带var/function关键字的进行提前的声明和定义 => 变量提升机制

  • 带var的只是提前声明(declare) “var a;” 如果只声明没有赋值,默认值是undefined
  • 带function的不仅声明,而且还定义了(defined) “a=13”定义其实就是赋值,准确来说就是让变量和某个值进行关联

带var和不带var的区别

//  => 在全局作用域下的区别
/*
 * 不带var的:相当于给全局对象window设置了一个属性a 【而不是变量。】
 *    window.a = 13;
 */
a = 13;
console.log(a); //  => window.a

/*
 * 栈内存变量存储空间
 *    b
 * 带var的:是在全局作用域下声明了一个变量b(全局变量),但是在全局下声明的变量也同样相当于给window增加了一个对应的属性(只有全局作用域具备这个特点) 【即是变量,又是window的属性。】
 */
var b = 14; //  => 创建变量b & 给window设置了属性b
console.log(b); //  => 14
console.log(window.b); //  => 14

/*
 * 全局作用域(栈内存)
 *   1.变量提升
 *     var a;    
 *   2.代码执行 
 */
console.log(a); // => undefined
var a = 12;
a = 13;
console.log(a); // => 13


// ------------------------------------


/*
 * 全局作用域(栈内存)
 *   1.变量提升
 *        
 *   2.代码执行 
 */
//  => Uncaught ReferenceError: Cannot access 'a' before initialization 在JS中上一行代码报错,下面的代码都不会再去执行了
console.log(a); 
let a = 12;
a = 13;
console.log(a);



// ------------------------------------


/*
 * 全局作用域(栈内存)
 *   1.变量提升
 *   2.代码执行 
 */
// 【这里没有声明变量的关键字,不存在变量声明。】
console.log(a); //  => Uncaught ReferenceError: a is not defined 
a = 13; //  => window.a=13;
console.log(a);
var b = 14;
console.log(b);
console.log(window.b);

479 变量提升机制_第1张图片

你可能感兴趣的:(479 变量提升机制)