js 变量 函数名的提升

来源:互联网 发布:网站推广工作是seo吗 编辑:程序博客网 时间:2024/06/04 18:34

函数定义时候

function  函数名(){

......

}

调用时候,可以在函数之前调用 函数名();这就是函数名的提升


如果采用赋值的方式定义函数

例如 

<pre name="code" class="javascript"><script type="text/javascript">alert(foo); //打印函数2window.onload=function(){alert(foo);//打印函数1 将2覆盖document.write(foo(20)); //执行函数1}//赋值定义函数   函数1var foo = function(){return 11;}//声明式定义函数  函数2function foo(x) {    if (x > 100) {         var tmp = x - 100;    }    return tmp;}</script>


函数2 定义后直接提升到代码头部,所以第一个 alert(foo)打印函数2的内容。

函数1定义后,相当于覆盖了函数2的定义,所以onload中的alert打印函数1的内容。document.write

执行函数一也就理所应当了。如果没有函数2,在上面调函数foo将会打印undefined,也就是这种方式函数不会提升

其实函数一在生命时候,变量foo也提升至代码头部 ,但是没有赋值,执行到函数1位置时候才将匿名函数赋值给变量foo。

既然如此,变量foo 和函数foo 均提升到代码头部,那么代码如果改成这样,第一个alert() 会执行foo函数还是foo变量那?

alert(foo); //打印函数2window.onload=function(){alert(foo);document.write(foo(200)); }function foo(x) {    if (x > 100) {         var tmp = x - 100;    }    return tmp;}var foo;

结果是:执行函数foo ,不管 var foo 变量跟foo(x)函数的位置如何互换。

那么是不是可以说,同级别相同名字的函数和变量同时声明,不管位置如何,函数都会覆盖变量?可以看到变量只声明,却没有赋值,如果为变量赋值的话  将上诉代码改成var foo =2;并与函数调换位置试验下,第一个alert()会怎么工作那,结果是照样打印函数内容。 代码如下:

<script type="text/javascript">alert(foo); <span style="font-family: Arial, Helvetica, sans-serif;">//打印函数</span>alert(foo(200)); //打印函数window.onload=function(){alert(foo);//打印变量document.write(foo(200)); //报错}var foo =2; //在这赋值 ,声明提升function foo(x) {    if (x > 100) {         var tmp = x - 100;    }    return tmp;}</script>
如果改成这样

var foo =2;function foo(x) {    if (x > 100) {         var tmp = x - 100;    }    return tmp;}alert(foo)//打印2 因为函数飞升了;alert(foo(200)); //报错 

alert只打印变量,函数总是报错。看来同名的函数和变量会有这么多需要注意的地方,实际编程就不要这样做了吧。





0 0