JS 之函数

121 阅读2分钟

1、未指定返回值的函数返回的是一个特殊的 undefined 值

** return ** 未指定返回值的函数返回的是一个特殊的 undefined 值.

function add() {
    return;
}
console.log(add()) // undefined

2、函数的参数 arguments

你定义的函数只接收两个参数,在调用这个函数时也未必一定要传递两个参数。可以传递一个、三个甚至不传递参数,而解析器永远不会有什么怨言。之所以会这样,原因是 ECMAScript 中的参数在内部是用一个数组来表示的。

arguments 对象只是与数组类似(它并不是 Array 的实例),因为可以使用方括号语法访 问它的每一个元素(即第一个元素是 arguments[0],第二个元素是 argumetns[1],以此类推),使 用 length 属性来确定传递进来多少个参数。

function info (name, age) {
    console.log(arguments)   //Arguments(2) ["xl", "19", callee: ƒ, Symbol(Symbol.iterator): ƒ]
    console.log(arguments[0])    // xl
    console.log(arguments[1])    // 19
    console.log(arguments[2])    // undefined
    console.log(arguments.length)  // 2
}
info('xl', '19')

3、函数的参数是按值来进行传参的

所有函数的参数都是按值传递的

    1. 例子一:
function setName(obj) { 
 obj.name = "Nicholas"; 
} 
var person = new Object(); 
setName(person); 
alert(person.name); //"Nicholas"
    1. 例子二:
function setName(obj) { 
 obj.name = "Nicholas"; 
 obj = new Object(); 
 obj.name = "Greg"; 
} 
var person = new Object(); 
setName(person); 
alert(person.name); //"Nicholas" 

这个例子与前一个例子的唯一区别,就是在 setName()函数中添加了两行代码:一行代码为 obj重新定义了一个对象,另一行代码为该对象定义了一个带有不同值的 name 属性。在把 person 传递给setName()后,其 name 属性被设置为"Nicholas"。然后,又将一个新对象赋给变量 obj,同时将其 name属性设置为"Greg"。如果 person 是按引用传递的,那么 person 就会自动被修改为指向其 name 属性值为"Greg"的新对象。但是,当接下来再访问 person.name 时,显示的值仍然是"Nicholas"。这说明即使在函数内部修改了参数的值,但原始的引用仍然保持未变。实际上,当在函数内部重写 obj 时,这个变量引用的就是一个局部对象了。而这个局部对象会在函数执行完毕后立即被销毁