一、var和默认定义的区别,请先看下面两个例子:
例子1:
var a=1;
function fun(){
a=2;
alert(a);}fun();alert(a);结果:2 ,2 函数中默认定义(也就是直接赋值)a=2时,此时的a使用的是外层定义的a,因此改变了外层a的值。
例子2:
var a=1;function fun(){var a=2;alert(a);}fun();alert(a);结果:2 ,1 函数中直接赋值语句var a=2,中的a使用的是函数作用域的变量a,因此没有改变外层a的值。
总结:其实JavaScript中变量的定义是,当使用var定义时就是在当前域先定义变量,然而使用默认的定义时,就现在当前作用域寻找该变量,如果当前作用域没有该变量,就往上也就是外层去寻找,如果没找到就是undefine,找到就是外层的值。
二、var定义的特性
例子1:
var a=1;function f(){if(!a){var a=2;}alert(a);}f();alert(a);结果: 2 1
刚开始,可能会认为,a=1,所以!a为false,所以输出两个1.其实真正的过程是这样的:
function f(){var a;
if(!a){//没有值 所以为true
a=2;
}
alert(a);
}结论:var 定义会"上升",编译器解析的时候会把从变量声明放在该作用域的最上方,注意:是把声明上升,var a;是声明。var =1;是定义。(有赋值才算定义)
例子2
var a=1;function f(){
if(!a){
a=2;
}
alert(a);}
f();
alert(a);
结果: 1 1
这个就是前面说的,使用和不使用var定义的区别了,这里a=2,使用的是外层的a,所以a=1,所以if不执行。以上就是var定义变量的特性。
三、有名函数和匿名函数有名函数:
funtion fun(){....
}
匿名函数: function(){
}
两种函数使用的区别:
有名函数:
fun();
匿名函数:
var fun=function(){
}
fun();
匿名函数的使用需要用表达式的方式将函数赋值给变量 此变量存储的是函数的地址。
此外有名函数和var 定义变量一样,有上升的特性。
fun();
function fun()
{
alert(1);
}
这样是没有问题的,定义在使用之后,因为编译的时候 函数的定义会上升至该作用域最顶端。
fun();
var fun=function (){
alert(1);
}
匿名函数则不能如此使用,会报错。
同时有名函数的函数名是唯一的,如果重复定义,则新的覆盖旧的。
例子:
function fun(){
alert("old");
}
fun();
function fun(){
alert("new");
}
结果 new
而匿名函数,使用变量接收函数地址,如果重复定义,新旧都存在。
例子:
var fun1= function()
{
alert("old");
}
var fun2=fun1; //将旧的函数地址给fun2
var fun1=function()
{
fun2();
alert("new");
}
fun1();
结果 old new 注意:这里fun1()被指向了新地址 ,fun2()保留以前的地址。所以两个函数都存在。
并不是fun1改变后,fun2也跟着改变。