4.1 函数的声明和命名规范
4.1.1 声明方式
1. 函数声明方式
function 函数名(参数) {
}
function test() {
var a = b = 1;
console.log(1);
}
function() {
console.log(1);
};
2. 函数字面量/函数表达式方式(重要)
var test = function res() {
console.log(1);
}

3. 关于函数字面量函数名称自动忽略的解释
- 在对变量test赋值的时候,系统会自动忽略res函数名
var test = function res() {
console.log(1);
}
test();
res();
var test = function res() {
console.log(1);
console.log(test());
console.log(res === test);
console.log(arguments.callee.name);
}
test();
- 函数可以通过(函数名.name)打印出函数名?为什么函数有属性?
var res = function test() {
console.log(test.name);
console.log(arguments.callee.name);
}
res();
console.log(res.name);
var res = function() {
console.log(res.name);
console.log(arguments.callee.name);
}
res();
console.log(res.name);
window.res = function() {
console.log(1);
}
console.log(res.name);
在Es6中在类中的static关键字就表示类的静态属性或者方法。
function res() {}
res.name = '我是方法名';
res.fn = function(){
console.log('我是函数的fn方法');
}
res();
console.log(res.name);
res.fn();
4.1.3 函数的组成部分
function 函数名(参数) {
}
4.1.4 函数的形式参数和实际参数
1. 形式参数(占位-->形式上占位)
function res(a, b, c) {
}
2. 实际参数(实际参数就是给形式参数赋值用的)
function res(a, b, c) {
console.log(a + b + c);
}
res(1, 2, 3);
3. 形参和实参的注意事项
function res(a, b, c) {
console.log(a + b + c);
}
res(1, 2, 3);
function res(a, b) {
console.log(a, b);
}
res(1);
function res(a, b) {
console.log(arguments.length);
console.log(arguments.callee);
console.log(res.length);
console.log(1, 2);
}
res(1, 2, 3);
function res(a, b) {
a = 3;
console.log(a);
console.log(arguments[0]);
}
res(1, 2);
function res(a, b) {
b = 3;
cosole.log(b);
console.log(arguments[1]);
}
res(1);
function res(a, b) {
a = 3;
console.log(a);
console.log(arguments[0]);
}
res(1, 2);
4.实际参数和形式参数映射关系的深层度理解
var a = 1;
function test(a) {
a = 3;
console.log(a);
console.log(arguments[0]);
}
test(a);
console.log(a);
var a = {
name: 'tom'
}
function test(a, b) {
a = new Object({ name: 'Shelly' });
console.log(a);
console.log(arguments[0]);
}
test(a);
console.log(a);
var a = {
name: 'tom'
}
function test(a,b) {
a.name = 'Jack';
console.log(a);
console.log(arguments[0]);
}
test(a);
console.log(a);
4.1.5 函数的return
- 如果不指定返回值,系统会隐式添加return
- 函数遇到return关键字立即终止函数运行
- return 后面的代码不会执行
function test() {
console.log('执行');
console.log('执行完就结束');
}
4.1.6 return关键字
return 语句终止函数的执行,并返回一个执行的值给函数调用者
下列return 语句都会终止函数的执行:
return;
return true;
return false;
return x;
return x + y / 3;
自动插入分号(ASI)规则会影响return语句。在return关键字被返回的表达式之间不允许使用行终止符。
return
a + b;
--------->
return;
a + b;
--------->
function fn() {
return
{
message : 'a'
}
}
console.log(fn());
4.1.7 初始作用域[[scope]],
b = 1;
function test() {
var a = 2;
console.log(b);
}
test();
console.log(a);
- 定义一个函数,从window.prompt()函数接收一个n,算出n的阶乘,不能用for循环;// 递归
var n = parseInt(window.prompt('N=?'));
function factorial(n) {
if( n <= 0 ) {
return '您输入的有误';
}
if(n === 1) {
return 1;
}
return factorial(n-1) * n;
}
var mul = factorial(n);
console.log(mul);
- 定义一个函数,从window.prompt()函数接收一个n,算出斐波那契数列的第n位,不能用for循环; // 递归
fobonaq(5) = fobonaq(3) + fobonaq(4);
fobonaq(4) = fobonaq(3) + fobonaq(2);
fobonaq(3) = fobonaq(2) + fobonaq(1);
fobonaq(2) = 1;
fobonaq(1) = 1;
var n = parseInt(window.prompt('N=?'));
function fobonaq(n) {
if( n <= 0 ) {
return '输入的有误';
}
if( n === 1 || n === 2) {
return 1;
}
return fobonaq(n - 2) + fobonaq(n - 1);
}
var num = fobonaq(n);
console.log(num);