关于js的变量提升(hoisting)

javascript的变量声明具有hoisting机制,JavaScript引擎在执行的时候,会把所有变量的声明都提升到当前作用域的最前面。
案例1

var v = "hello";
(function(){
  console.log(v);
  var v = "world";
})();

输出的结果为:undefined。不是hello也不是not defined

案例2

var v = "hello";
if(true){
  console.log(v);
  var v = "world";
}

结果为:hello。

上面两个案例说明了:javascript是没有块级作用域的。函数是JavaScript中唯一拥有自身作用域的结构。

  • 另外,在js中不用var 声明的变量都是全局变量,而且是顶层对象window的属性。不过在js严格模式下是会报错的。
2、关于声明函数两种形式的变量提升

请注意函数表达式并没有被提升,这也是函数表达式与函数声明的区别。进一步看二者的区别:

(function(){
  //var f1,function f2(){}; //hoisting,被隐式提升的声明
 
  f1(); //ReferenceError: f1 is not defined
  f2();
 
  var f1 = function(){};
  function f2(){}
})();
  • 只要函数声明f2被提升,变量f1也被提升但提升为undefined,执行到函数表达式处才被赋值的。

最后来一个小案例:

  
  
  
  
  
  
  
  
  
  

当文档加载完毕,给几个按钮注册点击事件,当我们点击按钮时,会弹出什么提示框呢?

很容易犯错,对是的,三个按钮都是弹出:"Button4",你答对了吗?

当注册事件结束后,i的值为4,当点击按钮时,事件函数即function(){ alert("Button"+i);}这个匿名函数中没有i,根据作用域链,所以到buttonInit函数中找,此时i的值为4,

所以弹出”button4“。

以上转载自原文地址

你可能感兴趣的:(关于js的变量提升(hoisting))