- 如果函数作用域内的变量未经声明就被初始化了,那么它就会自动被添加到全局上下文
规则1、匿名函数变量提升
let a = function () {
console.log(1)
};
a();
b();
function b () {
console.log(2);
}
=>
let a;
function b(){
console.log(2);
}
a = function () {
console.log(1)
};
a();
b();
规则2:关于函数形参相关的提升,如果有形参传入,那么形参赋值是在变量提升之前.
function fun (a) {
console.log(a);
var a = 2
}
fun(3);
=>
function fun (a) {
var a = 3;
var a;
console.log(a);
a = 2;
}
fun(3);
规则3、不会跨script标签提升,提升只会提升到所在script标签的最顶端
<script>
let b = 2;
console.log(a);
</script>
<script>
let a = 1;
console.log(b);
</script>
规则4、条件式函数声明的只会提升函数名字,不会提升函数
console.log(a);
if(true){
function a(){
}
}
规则5、if语句没有作用域
if (!foo) {
var foo = 10
}
console.log(foo)
=>
var foo
if (!foo) {
foo = 10
}
console.log(10)
实例
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();
getName();
Foo().getName();
getName();
new Foo.getName();
new Foo().getName();
new new Foo().getName();