js声明函数(function)和变量(variable)不得不防的坑
在工作中初级程序员容易忽略的细节就是函数和变量的声明都存在提升,而且他们之间的提升是不同的,请看下面的演示:
function funa(){console.log("funa")}//函数声明
function funb(){console.log("funb")}//函数声明
function func(){//局部作用域
console.log(typeof funa);//function是一个函数
console.log(typeof funb);//undefined未定义
funa();//aa
funb();//funb is not a function
function funa(){console.log("aa")}//函数声明
var funb=function(){console.log("bb")}//函数表达式
}
func();
可以看到func()输出结果为‘aa’和一个警告提示funb is not a function,函数的提升导致了这个结果,函数是对象并且提供局部作用域,所以如果函数内部声明了和外部相同的函数,函数内部作用域会把指针指向内部定义的函数声明,所以funa会输出“aa”。而funb为什么不是一个函数呢?typeof为什么会输出undefinedne?这就是函数提升和变量提升的不同之处了,函数声明不管是在处在文档的何处位置都将被提升到顶部,并且函数定义也被提升,所以funa()可以正常输出。而变量的提升只会提升变量的声明,也就是var funb这一部分,后面的定义赋值将被留在原来位置。所以输出undefined和funb不是一个函数。
了解函数和变量提升会对以后的工作中处理异常问题起到作用。希望大家一起讨论javascript的相关问题,请关注并留下您的高见。