Skip to content

Latest commit

 

History

History
215 lines (197 loc) · 3.42 KB

变量提升.md

File metadata and controls

215 lines (197 loc) · 3.42 KB

1.变量提升

// 1
console.log(tt);
tt = "dd";
console.log(tt);
// 变量提升之后的代码:
var tt;
console.log(tt); //undefined
tt = "dd";
console.log(tt); //'dd'
// 2
if (!a) {
  var a = 2;
}
console.log(a);
// 变量提升之后的代码:
var a; //undefined
if (!a) {
  //true
  a = 2;
}
console.log(a); //2

2.函数提升

// 1
if (false) {
  function fn() {
    console.log(1);
  }
}
console.log(fn);
fn();
// 变量提升之后的代码:
var fn; //undefined
if (false) {
  function fn() {
    console.log(1);
  }
}
console.log(fn); //undefined
fn(); // fn is not a function
// 2
function fn() {
  foo();
  return;
  function foo() {}
}
fn();
// 变量提升之后的代码:
function fn() {
  function foo() {}
  foo(); // 没有输出也不会报一个错误,因为foo是一个函数
  return;
}
fn();
// 3
function bar() {
  console.log(foo);
  return;
  var foo = function() {};
}
bar();
// 变量提升之后的代码:
function bar() {
  var foo;
  console.log(foo); // undefined
  return; // 函数return之后的代码依旧会发生变量提升
  foo = function() {};
}
bar();
// 4
console.log(f1);
console.log(f2);
function f1() {}
var f2 = function() {};
// 变量提升之后的代码:
function f1() {} // 函数提升,整个代码块提升到文件的最开始
var f2;
console.log(f1); // function f1() {}
console.log(f2); // undefined
f2 = function() {};

3.函数和变量同时提升

// 1
console.log(fn);
var fn = function() {
  console.log(1);
};
console.log(fn);
function fn() {
  console.log(2);
}
console.log(fn);
// 变量提升之后的代码:
var fn;
function fn() {
  console.log(2);
}
console.log(fn); // 2
fn = function() {
  console.log(1);
};
console.log(fn); // 1
console.log(fn); // 1
// 2
console.log(f1());
console.log(f2);
function f1() {
  console.log("aa");
}
var f2 = function() {};
// 变量提升之后的代码:
var f2
function f1() {
  console.log("aa"); // "aa"
}
f2 = function() {};
console.log(f1()); // undefined
console.log(f2); // ƒ () {}
// 3
(function() {
  console.log(a);
  a = "aaa";
  var a = "bbb";
  console.log(a);
})();
// 变量提升之后的代码:
// 4
console.log(a);
var a = 1;
console.log(a);
function a() {}
console.log(a);
// 变量提升之后的代码: 函数的提升后的位置是在变量提升后的位置之后的
var a;
function a() {}
console.log(a); // a()
a = 1;
console.log(a); // 1
console.log(a); // 1
// 5
console.log(a);
var a = 1;
console.log(a);
function a() {}
console.log(a);
console.log(b);
var b = 2;
console.log(b);
function b() {}
console.log(b);
// 变量提升之后的代码:
var a;
var b;
function a() {}
function b() {}
console.log(a); // a()
a = 1;
console.log(a); // 1
console.log(a); // 1
console.log(b); // b()
b = 2;
console.log(b); // 2
console.log(b); // 2
// 6
console.log(a);
console.log(b); // 报错 隐式全局变量不会提升
b = "aaa";
var a = "bbb";
console.log(a);
console.log(b);