< 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。