JavaScript中的函数基础知识
- 1.函数声明的三种方式
- 1.1 函数声明语句
- 1.2 函数表达式
- 1.3 new Function
- 2.函数的返回值
- 3.函数调用的几种方法
- 4.函数参数
- 4.1 函数内部的arguments对象(是个伪数组)
- 4.2 获取形参的个数
- 4.3 函数不存在重载
- 4.4 参数传递
- (1) 基本数据类型传递(值传递)
- (2) 引用数据类型传递(引用传递)
- (3) 总结
- 5.函数属性
1.函数声明的三种方式
1.1 函数声明语句
javascript">function fn(x,y,z){...
}
1.2 函数表达式
javascript"> let sum1 =function(){}//匿名函数let sum2 =()=>{} //箭头函数let sum3=function sumFn(){}//有名称sumFn,sumFn只能在函数内部用
1.3 new Function
最后一个参数是我们要执行的函数体,语法如下:
let funcName= new Function("arg1","arg2","arg3","arg4","arg5",......,"函数体")
javascript">let sum=new Function("a","b","return a+b")
2.函数的返回值
return
后不跟值或者没有return
,则默认该函数的返回值为undefined
3.函数调用的几种方法
- 函数调用方法
- 对象的方法调用方式(打点方式)
- 构造函数调用方式
- 间接调用方式
call、apply、call等方法
以上几种调用方法相信大家都清楚。不太了解的参见https://blog.csdn.net/fageaaa/article/details/145694249
4.函数参数
4.1 函数内部的arguments对象(是个伪数组)
javascript">function add(x,y){console.log(arguments[2])//3
}
add(1,2,3);
4.2 获取形参的个数
javascript">function add(x,y){...
}
console.log(add.length)//2
4.3 函数不存在重载
ps:java中是存在重载的。我们可以举一个例子:
javascript">function add(x, y) {console.log(x + y);
}
function add(x, y, z) {console.log(x + y + z);
}
//在javascript中这里答应NaN,而不是3。因为在javascript中不存在重载,一旦两个函数名相同
//后一个函数就会覆盖前一个函数,所以z=undefined,相加是非数字类型
add(1, 2); //NaN
add(1, 2, 3); //6
重载:定义相同的函数名,传入的不同参数;
4.4 参数传递
(1) 基本数据类型传递(值传递)
被传递的值会被复制到另外一个局部变量。
javascript">function addTen(num) {num += 10;return num;
}
let count = 20;
let result = addTen(count);
alert(count); // 20, 没有变化
alert(result); // 30
(2) 引用数据类型传递(引用传递)
示例1:
javascript">function setName(obj) {obj.name = 'Nicholas';obj = new Object();obj.name = 'Greg';
}let person = new Object();
setName(person);
//obj的值指向了person
//obj.name = 'Nicholas',所以person的值name被改为了Nicholas,
//之后obj = new Object(),它自己又开辟了一个新地址
//所以obj.name = 'Greg'该的是obj新地址内name的值而不是person的name值
alert(person.name); // Nicholas
示例2:
javascript">function fn(obj = { name: "沙和尚" }) {console.log(obj);obj.name = "唐僧";console.log(obj);
}
//调用fn,obj开辟一块新地址
fn(); //沙和尚 唐僧
//调用fn,obj依然开辟一块新地址
fn(); //沙和尚 唐僧
示例3:
javascript">let obj = { name: "沙和尚" };
function fn(a = obj) {console.log(a);obj.name = "唐僧";console.log(a);
}
//调用fn,将obj的地址传递给a(a指向obj)
fn(); //沙和尚 唐僧
//调用fn,将obj的地址传递给a(a指向obj)
//但这时候obj的name已经被改为了唐僧
fn(); //唐僧 唐僧
示例4:
javascript">//这个与3类似
let obj = { name: "沙和尚" };
function fn(a) {console.log(a);obj.name = "唐僧";console.log(a);
}
fn(obj); //沙和尚 唐僧
fn(obj); //唐僧 唐僧
(3) 总结
- 值传递:
将number, string, boolean, undefined, null, 和 symbol这些类型的变量作为参数传递给函数时,函数内部接收的是这些值的副本。 - 引用传递:
将对象(Object)、数组(Array)和函数(Function)等复合类型的变量作为参数传递给函数时,函数内部接收的这些对象在内存中的地址的副本,而不是对象的实际内容。因此,对参数所做的任何修改都会影响原始对象。
5.函数属性
javascript">function fn(a, b) {//形参的个数console.log(arguments.length); //3//实参的个数console.log(fn.length); //2console.log(fn.name); //fn
}
fn(1, 2, 3);
console.dir(fn);
打印的fn结果如下: