这是我参与更文挑战的第6天,活动详情查看:更文挑战
什么是函数
在javaScript中,函数是头等对象。因为它们可以像任何其他对象一样具有属性和方法。也就是说每个函数都是一个Function对象。
一个函数始终都有一个返回值,如果没有使用return语句返回特定的值,则会默认返回undefined
函数参数的按值传递
调用函数时,传递给函数的值被称为函数的实参(值传递),对应位置的函数参数名叫作形参。
在向参数传递基本类型的值时,被传递的值会被复制给命名参数,即arguments对象数组的中一个元素。在向参数传递引用类型的值时,会把这个值在内存的地址传递给命名参数即函数内的局部变量,此时若局部变量变化则可以影响到函数外部。
function myFunc (obj) {
obj.name = 'abc'
}
let obj = {
name: 'hahaha'
}
myFunc(obj)
console.log(obj.name) // 'abc'
复制代码
从上述代码的输出结果,我们可以很明显的看出,在执行完myFunc函数之后更改了传入的对象的name属性的值,也就是说函数参数是引用类型时,会把内存的地址值传递给函数内部的局部变量,此时函数内部和外部定义的obj对象指向的时内存中的同一个地址值,所以在函数内改变其属性值的时候,也就会反应到外部。
再看下面代码:
function myFunc (str) {
str = 'abc'
console.log(str) // 'abc'
}
let str = '123'
myFunc(str)
console.log(str) // '123'
复制代码
上述代码也可以明显看到,虽然传进去了str字符串,并且在内部改变了其值,但是并没有影响到外部的值。这是因为在函数参数是基本类型时,其实是将值复制了一份给函数的命名参数,函数内部的局部变量str和外部的str已经是两个完全独立的个体了。
arguments对象
arguments是一个包含了传递给当前执行函数参数的类似于数组的对象。换句话说:arguments是一个类数组
arguments对象是所有(非箭头)函数中都可用的局部变量。
// 将类数组arguments转为真正的数组
var args = Array.prototype.slice.call(arguments);
var args = [].slice.call(arguments);
const args = Array.from(arguments);
const args = [...arguments];
复制代码
- arguments.callee: 当前正在执行的函数。
- arguments.caller:调用当前执行函数的函数
- arguments.length:传给函数的参数的数目。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END