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();