您的位置:首页 > Web前端 > JavaScript

js 变量 函数名的提升

2015-06-27 17:27 651 查看
函数定义时候

function 函数名(){

......

}

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

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

例如

<pre name="code" class="javascript"><script type="text/javascript">
alert(foo); //打印函数2
window.onload=function(){
alert(foo);//打印函数1 将2覆盖
document.write(foo(20)); //执行函数1

}
//赋值定义函数   函数1
var foo = function(){
return 11;
}
//声明式定义函数  函数2
function 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); //打印函数2
window.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只打印变量,函数总是报错。看来同名的函数和变量会有这么多需要注意的地方,实际编程就不要这样做了吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: