Javascript ';风险值a';vs';这是.a';在功能块中

Javascript ';风险值a';vs';这是.a';在功能块中,javascript,Javascript,我试图在网上搜索,但没有得到任何答案。为什么在声明之前访问两个变量会有两种不同的输出: function test() { console.log(a); // prints 'undefined'. console.log(b); // prints 'b is not defined'. var a = 5; this.b = 10; } 首先,您试图在声明变量之前检查它们。 这是正确的顺序: function test() { var a=5; t

我试图在网上搜索,但没有得到任何答案。为什么在声明之前访问两个变量会有两种不同的输出:

function test() {
    console.log(a); // prints 'undefined'.
    console.log(b); // prints 'b is not defined'.
    var a = 5;
    this.b = 10;
}

首先,您试图在声明变量之前检查它们。 这是正确的顺序:

function test()
{
  var a=5;
  this.b=10;

  console.log(a); // Should print 5
  console.log(b); // Should print undefined
  console.log(this.b); // Should print 10
}
第二,关于您的问题,在函数中声明一个
var
,make是函数中的一个局部私有变量。
声明
this.b
,将导致
b
位于不同的范围内,而
b
本身为
未定义的
。如果要在函数内部使用
b
,请在使用
var
编写变量时使用
this.b

将变量变为函数 级别变量。因此现在
a
是一个变量,它出现在
consol.log(a)
之前,并且它没有给定值,因此它的
未定义
对于b,在调用之前没有定义名为b的变量

使用
var
定义的所有变量将是函数级变量,并将在函数中的任何其他变量之前创建。因此,
a
将在启动时出现在函数中


这里,
这个
将保存Windows的对象。

当您在函数中声明var变量时,该变量仅限于该函数。这意味着该变量的作用域仅限于该函数,所以您不能在该函数之外访问该变量

但是,如果您使用它,那么它可以通过外部进行访问,但是您需要创建该类/函数的对象并通过它进行访问

函数测试(){
var a=5;
这个b=10;
this.printB=函数(){
把这个还给我;
}
this.printA=函数(){
返回a;
}
}
var obj=新测试();
控制台日志(obj.a)
控制台日志(obj.b)
console.log(obj.printA())

console.log(obj.printB())
对这个问题投了否决票的人应该留下一条评论来解释否决票。我没有投票,但这是不正确的
this.b
不构成局部变量。@DanielT.-那也不对。在另一个函数内调用
test()
,不会创建另一个函数的局部变量。您在注释中显示的示例仍将在
test()
@nnnnnn this()内有
this
作为
window
。b将打印10,b也将在控制台打印10。logthis.(变量)称为“Intermediate”作用域
var a
在函数中使用时不会创建全局变量。是的,其函数级别变量代码块不构成问题。你应该在那里声明问题,这样人们才能更好地找到答案。@RavinderKumar,你会想看看Darin Dimitrov指出的变量提升。代码最初是针对声明运行的。这允许在运行时命中变量和函数之前调用它们。因为这个.b是一个赋值而不是一个声明,所以您最终会看到它没有定义。