我正在学习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循环中内联定义。我在这里错过了什么吗?
答案 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
}