变量声明提前

      /*
			当前作用域内的声明都会提升到作用域的最前面,包括变量和函数的声明
			注意: 只是提升声明 不提升赋值和函数表达式的函数体
			优先级: 语言内置(this、 arguments) ->  形参 -> 函数声明 -> 变量声明 
			根据优先级 后声明的会覆盖前面声明的同名变量 不管其类型是什么
      */
   		var hello="hello";
   		(function(){
   			console.log(hello);
   			var hello="hello world";
   		})(); // 输出 undefined


   		// 以上代码等价于
   		// var hello="hello";
   		// (function(){
   		// 	var hello;  // 所以是undefined
   		// 	console.log(hello);
   		//     hello="hello world";
   		// })();

这也就是为什么js代码编写过程中, 特意将变量放在函数体的顶部,而不是将声明靠近放在使用变量之处。 这种做法使得源代码非常清晰的反映了真实的变量作用域和执行顺序。####

原文地址:https://www.cnblogs.com/mushishi/p/5804746.html