关闭

javascript的悬停

443人阅读 评论(0) 收藏 举报


我们先来看一段代码:

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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:83572次
    • 积分:908
    • 等级:
    • 排名:千里之外
    • 原创:21篇
    • 转载:1篇
    • 译文:0篇
    • 评论:4条
    文章分类
    最新评论