关于函数内部javascript变量的说明

explanation on javascript variables inside a function

本文关键字:javascript 变量 说明 内部 于函数 函数      更新时间:2023-09-26

我正在学习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循环内部内联定义的。我是不是遗漏了什么?

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
}

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

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

CCD_ 9和CCD_。

在第三个示例中,函数中没有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

正如SebastienC.已经告诉您的那样,您的示例代码并没有按照您的意愿执行。for (var i=0; i< 10; i++);的意思是for (var i=0; i< 10; i++) {/*do nothing*/}。如果删除;,您会注意到您的函数将返回0,因为return关键字会停止函数,并且它会返回值,不会执行其他操作,您的循环将只运行一次。

此外,您应该使用++i。

Yes Javascript被解释,每当它发现一个已声明/未声明的var时,它就会声明它,然后执行操作,或者从技术角度来说,它会执行var提升。因此,现在变量已声明,但为undefined

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

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

将打印CCD_ 22。所以你可以把它看作

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