var 声明永远作用于脚本、模块和函数体这个级别,在预处理阶段,不关心赋值的部分,导致变量在预处理阶段和执行阶段被当作两个变量,严重违背了直觉
预处理在执行前,并且fun函数不会访问外层作用域的a,结果是undefined
var a =1;
function fun(){
console.log(a);
var a =2;
}
fun();
如果添加 if(false) 语句一般 if(false) 中的代码永远不会执行,但 var声明会穿透一切语句结构,它只认脚本、模块和函数体三种语法结构,所以结果还是undefined
var a =1;
function fun(){
console.log(a);
if(false){
var a =2;
}
}
fun();
引入with语句,用with(o)创建了一个作用域
在预处理阶段,var 声明穿透语句结构,导致同样为fun函数创建了 a 这个变量,但是没有赋值
在执行阶段,执行var a =2时,作用在 with语句内,这时候a被访问到对象o的属性a,但fun函数的a值依旧是 undefined
var a =1;
function fun(){
var o={a:3}
with(o){
var a =2;
}
console.log(o.a);
console.log(a);
}
fun();
早期JavaScript 没有 let 和 const 只能使用var 人民群众便发明了 ‘立即执行的函数表达式(IIFE)’
(function () {
statements
})();