解释函数内的javascript变量

时间:2015-07-30 14:52:04

标签: javascript

我正在学习javascript并遇到一个主题,提到函数内部声明的变量在函数内的任何地方都可用,javascript将变量定义放在顶部,如下例所示:

var functionScope=function(){
for (var i=0; i< 10; i++){//code inside this loop}
return i;
}
console.log(functionScope()); //prints 10

javascript实际上将上述功能转换为以下功能:

var functionScope=function(){
  var i;
  for ( i=0; i< 10; i++){//code inside the for loop}
  return i;
  }
console.log(functionScope()); //prints 10

由于javascript是解释语言,因此它逐行执行。它如何知道它应该在尝试访问变量后将变量拉到函数的顶部。当它试图访问变量时,它应该告诉undefined对吗?

另外,如果我认为变量将放在函数的顶部并且可以在任何地方访问,那么下面的代码应该打印10,但为什么以下代码打印undefined

var functionScope=function(){
  console.log('The value os i is '+i);
  var i = 20;
}
console.log(functionScope());

有人可以解释我的理解错误吗?

还有一个疑问:通常在Java中,如果我必须在for循环外打印i的值,我会得到一个错误,但在javascript中,变量仍然可以在for循环外部访问,如第一个例子的情况其中变量在for循环中内联定义。我在这里错过了什么吗?

3 个答案:

答案 0 :(得分:2)

var functionScope=function(){
for (var i=0; i< 10; i++);
    return i
}
console.log(functionScope()); //prints 10

这只是一个糟糕的缩进。由于;末尾的for,它不会将return i语句包含在循环中。

有一个很好的缩进来帮助你理解真正发生的事情:

var functionScope=function() {
    for (var i=0; i< 10; i++) 
        /* do nothing */;
    return i
}

答案 1 :(得分:1)

使用var,您告诉JS该变量不是全局的,并且它只能在函数内部可用。

使用=,您可以设置变量的值。

var i; for (i = 0; ...for (var i = 0; ...是一样的。

在第三个示例中,函数内部没有i。在这种情况下,JS会尝试在函数外部将其作为全局变量。如果您设置了window.i = 1,则会打印The value os i is 1,否则会产生错误,因为i没有在任何地方定义。

var i = 0;
var fn = function() {
    i = 1; //window.i = 1;
};
console.log(i); //prints 1


var i = 0;
var fn = function() {
    var i = 1; //fn.i = 1;
}
console.log(i); //prints 0


var fn = function() {
    var i = 1; //fn.i = 1;
}
console.log(i); //ReferenceError: i is not defined

var i;
var fn = function() {
    var i = 1; //fn.i = 1;
}
console.log(i) //prints undefined

正如Sebastien C.已经告诉过你的那样,你的示例代码不能做你想做的事情。 for (var i=0; i< 10; i++);表示for (var i=0; i< 10; i++) {/*do nothing*/}。如果您删除了;,则会注意到您的函数将返回0,因为return关键字会停止该函数,并且它会返回该值,不会执行任何其他操作,循环只运行一次。

此外,您应该使用++i

答案 2 :(得分:0)

是Javascript被解释,只要找到var声明/未声明的var,它就会声明它然后执行操作,或者在技术术语中它var hoisting。所以现在变量被声明,但是undefined

因此,对其进行的任何操作(除了赋值)都将导致其值仅为undefined。例如;

{
    x++ ; 
    var x = 10 ;
    console.log(x);
}

将打印10。所以你可以把它想象成

{
    var x = undefined; \\variable hoisted at beginning of block 
    x++ ; 
    x = 10 ;
    console.log( x ); \\ x = 10
}