首先,你完全理解错了js的变量作用域的范围和概念,所以导致了你的混乱。
1、在js中,变量的作用域是函数作用域,而不是块作用域,即,在一个函数中声明的变量,在整个函数中都可见,但在其他函数中不可见。
举例:(以高级语言c/c++/java为例)
块作用域的产生是有块{}中定义的变量只在块中可见,在其他块或块外不可见,比如
for (int i = 0;i < 10;i++) {
}
此时的i只在for循环体中可见
而js中,因为是函数作用域,所以
for (var i=0;i<10;i++) {}
中的i在循环所处的函数体内都可见
2、js没有public和private限定,只有变量都是public,都是函数作用域中的public
3、你所指的函数外,其实存在一个global作用域,可以简单的理解成全局作用域,其中定义的变量,可理解成为全局变量,但其实,在js中,由于所有皆对象,函数也是对象,所以一个函数是可以定义在另一个函数体内,并使用,这样就造成父函数中定义的变量在子函数中是可见的,但是子函数中定义的变量在父函数中是不可见的,即
function a() {
var ina = 1;
var b = function() {
var inb = 2;
alert(ina);
//输出1
}
b();
alert(inb)
//输出undefiend
}
3、同样,函数作用域内的变量定义会隐藏函数作用域外变量的定义