Javascript函数范围和提升

我刚刚阅读了一篇关于Ben Cherry的JavaScript范围和提升的伟大文章,其中他给出了以下示例:

var a = 1;

function b() {
    a = 10;
    return;

    function a() {}
}
b();
alert(a);

使用上面的代码,浏览器会提醒“1”。

我仍然不确定为什么它返回“1”。 他所说的一些事情想起来就像:所有的函数声明都被提升到顶端。 你可以使用函数来限定一个变量。 仍然不点击我。


功能提升意味着功能被移动到其范围的顶部。 那是,

function b() {  
   a = 10;  
   return;  
   function a() {} 
} 

将由中间人改写为此

function b() {
  function a() {}
  a = 10;
  return;
}

奇怪,呃?

而且,在这种情况下,

function a() {}

表现得和以前一样

var a = function () {};

所以,从本质上讲,这就是代码的作用:

var a = 1;                 //defines "a" in global scope
function b() {  
   var a = function () {}; //defines "a" in local scope 
   a = 10;                 //overwrites local variable "a"
   return;      
}       
b();       
alert(a);                 //alerts global variable "a"

你必须记住的是它解析整个函数并在执行之前解析所有的变量声明。 所以....

function a() {} 

真的变成了

var a = function () {}

var a将它强制为一个本地范围,并且变量范围贯穿整个函数,因此全局变量仍然为1,因为您已通过将其作为函数将a声明为本地范围。


函数a在函数b被吊起来:

var a = 1; 
function b() { 
   function a() {} 
   a = 10; 
   return;
} 
b(); 
alert(a);

这几乎就像使用var

var a = 1; 
function b() { 
   var a = function () {};
   a = 10; 
   return;
} 
b(); 
alert(a);

该函数局部声明,并设置a只在局部范围内,而不是全局变量发生。

链接地址: http://www.djcxy.com/p/96301.html

上一篇: Javascript function scoping and hoisting

下一篇: whats the difference between function foo(){} and foo = function(){}?