javascript的悬停


我们先来看一段代码:

var scope = "global";  
function f() {   
console.log(scope);    
var scope = "local";    
console.log(scope);    
} 

f();

借助firedebug的控制台命令行编辑器,我们可以得到以下结果:

undefined   
local 

 书上的解释是,与全局变量同名的局部变量在整个函数内部覆盖全局变量。简而言之,所有函数体内的变量声明(注意,仅仅是声明)都将被提到函数体开头进行。上述代码相当于以下代码的运行结果:


var scope = "global";   
function f() {   
var scope; //声明提到这里   
console.log(scope);    
var scope = "local"; //赋值仍然在这里  
console.log(scope);    
}

f();

在说下一个问题之前,先来看卡javascript中定义函数的两种方式,调试工具同样是使用firedebug的控制台命令行编辑器。

第一种,用变量声明的方式定义函数:

var bar = function() {
           alert("bar global");   
}   

bar();

第二种,函数定义的方式定义函数:

function bar() {
           alert("bar global");   
}   

bar();

由于js“悬挂”的存在,以上两种函数定义在下面的函数中有不同表现。

第一种

var bar = function() {           
alert("bar global");   
}   

function f() {   
bar();   
var bar = function() {           
alert("bar local");      
}   
}  

f();

运行会报错,因为这种方式相当于:

 var bar = function(){  
      alert("bar global");  
}  

function f(){  
  var bar;  
  bar();  
  var bar = function(){  
        alert("bar local")  
   }  
}

f();
用变量声明的方式定义函数时候,只有声明被提到函数的开头,而用函数定义的方式定义函数时,整个函数体都会被提到函数的开头。


第二种:

function bar() {
           alert("bar global");   
}   

//bar();

function f() {      
 bar();       
function bar(){
          alert("bar local");  
     }   
}

f();


这种方式等同于:

var bar = function() {  
alert("bar global");  
}  

function f() {  
// 函数的声明和定义都悬挂到开头进行     
var bar = function() {          
alert("bar local");     
}     
bar(); 
}  

f();


这里发现,用函数定义的方式定义函数时,允许函数没定义之前就使用它。


因此,在js good parts中作者推荐是用 var bar = function(){}的方式定义函数。




PS:本文参考了网上一些关于javascript悬停的文章,加入了自己的实际操作。







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值