var ss = function (){
console.log(1);
}
function ss (){
console.log(2);
}
ss(); //1
为什么调用ss输出的结果是1,有的人说 var 优先,能解释一下吗?
我开始也蒙了,后面一想,其实这个结果还真是那么回事,首先你应该也知道函数提升和变量提升
但是还有一个:函数提升优先级高于变量提升、而函数分函数声明式和函数字面量式,函数提升只对前者有效
你写的这两个函数,后者才会被提升,而运行后,后者被提升后,立马又被覆盖了,所以结果才是这样,
如果再加上变量:
alert(ss);//C函数
var ss = function() { //A
console.log(1);
}
var ss = 123456; //B
function ss() { //C
console.log(2);
}
alert(ss);//123456
上面结果解析:程序运行时,函数提升优于变量提升,而字面量式函数不会提升,因此,C在最上面,然后被A覆盖,最后被B覆盖,最后结果就是123456,而首行输出C函数,因为C在最上面,这里的提升只是声明提升,而赋值还在原地进行的.....
其实简单理解就像给变量赋值一样,两次赋值,后面的值会把前面的覆盖掉,这里把函数和变量都当成变量看就行了
@iiiiiim: 感谢您的回答,我明白了 微笑
作用域问题,function ss 可以理解为window.ss=xx;
var ss=function等于是当前方法体内的私有变量。级别高一些。
var bb=0;
function dmeo(){
var bb=1;
console.log(bb)//ouput 1;
}
dmeo();
咱暂且抛开这个问题,先来了解一下它俩的区别
1.首先我们要明确函数的声明形式可以有两种方式:
---函数表达式
var fun = function(){
}
---函数体
function fun(){
}
2.区别
函数表达式:只有var fun声明的后面使用函数
函数体:function fun(){}声明之前便可使用
注:本质上,都是表达fun()这个函数
3.对于这题
ss();是在两者的后面,对于funcion ss(){}早已经在var ss之前就解释完整,
但对于var ss=function(){},只有在var 的时候才解释,因此var ss=function(){}会
覆盖function ss(){};
显示1
这题涉及到函数申明提前,实际上代码可以认为是:
var ss; function ss (){ console.log(2); } ss = function (){ console.log(1); } ss();
结果可想而知。
这个是一个知识点,叫做,js变量提升。
函数申明优先运行,再运行函数函数赋值,所以函数赋值会覆盖函数申明
变量提升 然后 函数申明 大于变量的优先级 function ss(){} 最高优先级
– 偏灬爱 5年前