函数-传参
# 基础知识点
function(arg)
写函数的时候需要注意arg
是值传递还是引用传递// 1. 值传递(在函数体内修改参数值,不会影响到函数外) var p = 2; function f(p) { p = 3; } f(p); // 2. 引用传递(在函数体内修改参数值,会影响到函数外) let obj = { p: 1 }; function f(o) { o.p = 2; } f(obj); obj.p // 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14形参的个数 ? 实参的个数 不匹配
// 1. 形参 > 实参 function f(a, b) { console.log(arguments[0]); console.log(b) } f(1) // 1 // 2. 形参 < 实参 // 可以通过 arguments 来获得,见下分析
1
2
3
4
5
6
7
8arguments
对象无法显示赋值,如
arguments[0]="1"
是错误的。有2个常用属性:
arguments.length
、arguments.callee
。arguments
不是真正的数组对象,使用需要转换一下:var args = Array.prototype.slice.call(arguments); // 或者 var args = []; for (var i = 0; i < arguments.length; i++) { args.push(arguments[i]); }
1
2
3
4
5
6
7点击查看
虽然
arguments
很像数组,但它是一个对象。数组专有的方法(比如slice
和forEach
),不能在arguments
对象上直接使用,可以通过以下方法将使用
arguments.callee
进行递归解耦var sum = function (n) { if (1 == n) { return 1; } else { return n + arguments.callee(n - 1); //6 5 4 3 2 1 // 递归写法:return n + sum(n-1) } } alert(sum(6));
1
2
3
4
5
6
7
8
9🚨注:在
use strict
下,此方法不能使用。
# 面试考题
- 核心:
arguments
中this
的指向问题
var length = 10;
function fn() {
console.log(this.length);
}
var obj = {
method: function(fn) {
fn(); // 定义在全局下(即 this指向全局环境 )
arguments[0](); // 此时是从arguments中去取fn函数(this为argument内部环境)
}
};
obj.method(fn, 1);
输出:10,2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
编辑 (opens new window)
上次更新: 2022/04/06, 15:04:00