1,从作用域的角度出发:变量可分为全局变量和局部变量,全局变量顾名思义是在任何地方都可以访问的,而局部变量则不然,列如在一个函数中定义一个变量 :
先看看这两段代码的区别,第一段会正常输出11,而第二段就会输出undefined,这是为什么呢
function af(){
var b = 10;
}
这个变量b在函数外是访问不了的。
全局变量如何定义呢,可以直接在函数外 var c = 10; 或者是不加"var" 直接就是 c = 10,这种称为隐式申明;或者是加上window : window.c = 10;这里就有个地方要注意了:
如果你在一个函数内使用隐式申明或是加上window,这样的方式去定义一个全局变量,如
function bf(){
d = 11;
}
这时你直接在函数外访问 alert(d),是访问不了的,会报没有定义的错误,但是如果你先执行函数bf(),在访问变量alert(d),就可以了。其实这也很容易理解,函数未执行,这个变量就没有被申明,还没有为他分配内存,所以不存在。
2,全局变量和局部变量使用那个比较好:
这个问题其实也是很明显的,函数内的局部变量在函数执行的时候回为其分配内存,当函数执行完之后就会摧毁回收,而全局变量是要在程序执行完才能回收,尽可能的避免使用全局变量,因为它还可能带来其他问题,列如变量覆盖。而局部变量是鼓励使用的(当然不是乱使用),特别是涉及到要操作dom,或是需要多次去计算的情况下,比如在一个数组循环中,要把数组的值输出:
var ary = [1,2,3,4,5];
var leng = ary.length;//先把长度计算出,不要每次都去取数组的长度
for(var i=0; i<leng; i++){
.............
}
3,一些坑
其实这就跟变量的解析有关了,变量的解析开始是会在当前作用域内查找变量,如果没有找到,就会到上一层作用域去找,
但是在第二段代码中,是可以找到这个变量a的,所以它直接输出,但是很遗憾的是,这个变量还没有赋值,也就是等于申明了一个变量,但是没有赋值 就像:var a; alert(a) 这种情况。