JavaScript 的变量 var 预处理 设计失误

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
})();
上一篇:C++ STL 个人使用总结


下一篇:1079 延迟的回文数 (20 分)