JS变量提升

变量的声明提升到程序顶部

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

// 等价于
var a
console.log(a)
a = 2

函数提升高于变量提升

foo(); // foo
function foo() {
    console.log('foo');
}
var foo = 2;

// 等价于
var foo
function foo() {
    console.log('foo');
}
foo()
foo = 2
var foo = function() {
    console.log(1);
}
function foo() {
    console.log(2);
}
foo() // 1

// 等价于
var foo
function foo() {
    console.log(2);
}
foo = function() {
    console.log(1);
}
foo()

var、let和const的区别

  • var存在变量提升
  • let和const不存在变量提升
  • let为块级作用域变量,可以改变;const为常量,不可以改变
  • var是允许在相同作用域内重复声明同一个变量的,而let与const不允许这一现象。

例题

function Foo() {
    getName = function () {
        console.log(1);
    };
    return this;
}
Foo.getName = function () {
    console.log(2);
};
Foo.prototype.getName = function () {
    console.log(3);
};
var getName = function () {
    console.log(4);
};
function getName() {
    console.log(5);
}
Foo.getName(); // 2,Foo.getName()是自己的属性
Foo().getName(); // 1, 执行了Foo()函数,getName重新定义了
getName(); // 1,上一句执行了Foo()函数,getName重新定义了,getName是挂载在window的全局函数
new Foo.getName(); // 2,相当于new (Foo.getName()),对Foo.getName()执行new方法
new Foo().getName(); // 3,相当于先执行new Foo(),在访问实例上的getName方法,访问到了原型链上的方法
new new Foo().getName(); // 3,相当对new Foo().getName()执行new方法