< script type = "text/javascript" >
var x = 1;
var y = 0;
var z = 0;
function add(n) {
    n = n + 1;
}
y = add(x);
function add(n) {
    n = n + 3;
}
z = add(x);
s = y + z; 
< /script>

求: y的值是? z 的值是? s的值是?

我相信,肯定有同学会答错,当然,不是说他们不会,而是他们可能太大意了!

我们首先看function add,两个add都没有返回值,而我们知道,没有明确返回值的,全部返回undefined,所以,y和z都会是undefined,那么s自然也就不会是一个数字了,没错,s应该是NaN

 

假如我们将题目改一下呢?如下:

 

< script type = "text/javascript" >
var x = 1;
var y = 0;
var z = 0;
function add(n) {
    return n = n + 1;
}
y = add(x);
function add(n) {
    return n = n + 3;
}
z = add(x);
s = y + z; < /script>

两个function add都有返回值了,那么,y,z,s会是多少呢?

不错,y和z都是4,s是8,为什么y不是2而是4呢?因为在javascript中,直接通过function申明的函数,后面定义的,会影响到之前的引用,如下:

< script type = "text/javascript" >
function x() {
    alert(2)
};
x(); //output 3
function x() {
    alert(3)
};
x(); //output 3
< /script>

如果是通过var来申明的函数会是什么情况呢?我们看看:

< script type = "text/javascript" >
var x = function() {
    alert(0)
};
x(); //output 0
var x = function() {
    alert(1)
};
x(); //output 1
x(); //output 1
< /script>

通过var申明的函数,后面定义的并不会影响前面的引用。

如果两种模式混合,又会是什么情况呢?

< script type = "text/javascript" >
function x() {
    alert(2)
};
x(); //output 3
var x = function() {
    alert(0)
};
x(); //output 0
var x = function() {
    alert(1)
};
x(); //output 1
function x() {
    alert(3)
};
x(); //output 1
< /script>

结果是这样的,你猜到了吗?

通过function定义的函数,后面定义的,照旧影响了前面的引用,但是不能改变通过var申明函数后的引用,反而,通过var申明的函数,改变了后来通过function申明函数之后的引用。

所以,如果:

< script type = "text/javascript" >
var x = function() {
    alert(1)
};
x();
function x() {
    alert(3)
};
x(); 
< /script>

后面的x()出来的也会是1。