tcking/jsriver

函数与变量的声明

Opened this issue · 0 comments

函数是对象,函数也是变量。
“就近声明”,即在要使用变量的时候使用var来声明变量,尽量让其作用域小是个好习惯,不过变量声明会自动提升到当前作用域的顶级,这个特性会影响到平常代码的写法,稍后细说。
函数的声明方式:

  • 命名函数
fx();//可正常调用
function fx(){
//do something
}

fx的调用在函数声明之前,命名函数声明会自动提升到当前作用域顶级,类似于:

var fx  //声明会自动提升到作用域顶级

fx=function(){
//do something
}
  • 赋值函数
fx();//不能正常调用,函数的声明在赋值表达式右侧,在运行时才执行
var fx=function(){
//do something
}
  • 命名函数赋值给表达式 (不是一个好习惯,不要使用)

var fx2=function fx(){
    console.log(fx);
    console.log(fx2);
}
fx2();//打印出"fx()" ,"undefined",fx只在其内部可见,函数中查找变量次序为:局部变量->形参->函数名本身,如果没找到则到上一级作用域,例如闭包的引用重复以上过程直到全局范围。
fx();//ReferenceError,命名函数赋值后原命名函数只在内部可见

变量声明的自动提升

变量如果不声明,则会抛出ReferenceError错误,没有声明的变量只能用在typeof运算符上:

var dog;
console.log(typeof dog);// "undefined"
console.log(typeof cat);// "undefined" typeof 可以运算没有声明的变量
if(!dog){
//do sth
}
if(!cat){ //ReferenceError cat没有进行声明
//
}

如果代码改为:

if(!cat){ //可以正常执行
 var cat={name:"cat"}//声明会自动提升到当前域的顶级
}

则是可以正常执行的,和如下的代码等价:

var cat

if(!cat){
    cat={name:"cat"}
}