最近在学习JavaScript的函数,函数是JavaScript的一等对象,想要学好JavaScript,就必须深刻理解函数。本人把思路整理成文章,一是为了加深自己函数的理解,二是给读者提供学习的途径,避免走弯路。内容有些多,但都是笔者对于函数的总结。
1.函数的定义
1.1:函数声明
1.2:函数表达式
1.3:命名函数的函数表达式
1.4:函数的重复声明
1.5:不能在条件语句中声明函数
2.函数的部分属性和方法
2.1:name属性
2.2:length属性
2.3:toString()方法
3.函数作用域
3.1:全局作用域和局部作用域
3.2:函数内部的变量提升
3.3:函数自身的作用域
1.函数的定义
1.1:函数声明
函数就是一段可以反复调用的代码块。函数声明由三部分组成:函数名,函数参数,函数体。整体的构造是function命令后面是函数名,函数名后面是一对圆括号,里面是传入函数的参数。函数体放在大括号里面。当函数体没有使用return关键字返回函数时,函数调用时返回默认的undefined;如果有使用return语句,则返回指定内容。函数最后不用加上冒号。
function keith() {} console.log(keith()) // 'undefined' function rascal(){ return 'rascal'; } console.log(rascal()) // 'rascal'
函数声明是在预执行期执行的,也就是说函数声明是在浏览器准备解析并执行脚本代码的时候执行的。所以,当去调用一个函数声明时,可以在其前面调用并且不会报错。
1 console.log(rascal()) // 'rascal' 2 function rascal(){ 3 return 'rascal'; 4 }
其实这段代码没有报错的原因还有一个,就是与变量声明提升一样,函数名也会发生提升。函数名提升会在下面小节谈到。
1.2:函数表达式
函数表达式是把一个匿名函数赋给一个全局变量。这个匿名函数又称为函数表达式,因为赋值语句的等号右侧只能放表达式。函数表达式末尾需要加上分号,表示语句结束。
1 var keith = function() { 2 //函数体 3 };
函数表达式与函数声明不同的是,函数表达式是浏览器解析并执行到那一行才会有定义。也就是说,不能在函数定义之前调用函数。函数表达式并不像函数声明一样有函数名的提升。如果采用赋值语句定义函数并且在声明函数前调用函数,JavaScript就会报错。
1 keith(); 2 var keith = function() {}; 3 // TypeError: keith is not a function
上面的代码等同于下面的形式。
1 var keith; 2 console.log(keith()); // TypeError: keith is not a function 3 keith = function() {};
上面代码第二行,调用keith的时候,keith只是被声明了,还没有被赋值,等于undefined,所以会报错。
1.3:命名函数的函数表达式
采用函数表达式声明函数时,function命令后面不带有函数名。如果加上函数名,该函数名只在函数体内部有效,在函数体外部无效。
1 var keith = function boy(){ 2 console.log(typeof boy); 3 }; 4 5 console.log(boy); 6 // ReferenceError: boy is not defined 7 8 keith(); 9 // function
上面代码在函数表达式中,加入了函数名boy。这个boy只在函数体内部可用,指代函数表达式本身,其他地方都不可用。这种写法的用处有两个,一是可以在函数体内部调用自身,二是方便除错(除错工具显示函数调用栈时,将显示函数名,而不再显示这里是一个匿名函数)。
1.4:函数的重复声明
如果同一个函数被多次声明,后面的声明就会覆盖前面的声明。