如何在功能内部进行可变提升

时间:2016-07-28 05:38:07

标签: javascript hoisting

如果变量a在console.log之后声明,它的值应该是未定义的

function x(){
    b();
    function b(){
      console.log(a)   //displays value of a 
    }
    var a = "hello world"
}
x()

2 个答案:

答案 0 :(得分:0)

这在Javascript中称为变量提升。您可以阅读更多内容here。基本上,JavaScript解释器“向前看”以查找所有变量声明并将它们“提升”到函数的顶部。为了方便起见,你可以将这种行为联系起来,因为解释器会扫描两次代码,而在第一次扫描时,它会提升变量。

PrivateFontCollection pfc = new PrivateFontCollection();
pfc.AddFontFile("Axixa.otf");

Font fnt = new Font(pfc.Families[0], 8, FontStyle.Regular);
button1.Font = fnt; // This code change font correctly

Bitmap bmp = new Bitmap("1.png");

RectangleF rectf = new RectangleF(0, 0, bmp.Width, bmp.Height);

Graphics g = Graphics.FromImage(bmp);

g.SmoothingMode = SmoothingMode.AntiAlias;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;

g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
StringFormat format = new StringFormat()
{
    Alignment = StringAlignment.Center,
    LineAlignment = StringAlignment.Center
};
g.DrawString("123, 123", fnt, Brushes.Red, rectf, format);

g.Flush();
g.Save();

但如果它是一个自我调用,这将是未定义的。检查一下:

function x() {
  function b() {
    console.log('a: ', a); //displays value of a
  }
  var a = "hello world";
  b();
}
x();
作为自我调用,仅在第一次扫描时执行,它会查找function x() { (function b() { console.log('a: ', a); //displays value of a })() var a = "hello world"; } x();并记录a

事情仍然是相同的:

undefined

答案 1 :(得分:0)

您的更新代码:

function x(){
    b();
    function b(){
      console.log(a)   //displays value of a 
    }
    var a = "hello world"
}
x()

执行就像你写的那样:

function x(){
    var a;
    function b(){
      console.log(a)   //displays value of a 
    }
    b();
    a = "hello world";
}
x();

所以在调用b()时,变量a 存在(否则你会得到一个未定义的引用错误,它将停止执行而不是仅仅记录{{1 }}),但尚未分配值。

现在更有意义了吗?