JS函数和参数

1. 函数的length属性

length 是函数对象的一个属性值,指该函数有多少个必须要传入的参数,即形参的个数。

形参的数量不包括剩余参数个数,仅包括第一个具有默认值之前的参数个数。

与之对比的是, arguments.length 是函数被调用时实际传参的个数。

demo1:

function foo(a, b=1, c) {
  console.log(arguments.length); // 3
  // 形参的数量,仅包括第一个具有默认值之前的参数个数
  console.log(foo.length); // 1
}

foo(1, 2, 3)
复制代码

demo2:

function foo(a, ...args) {
  console.log(arguments.length); // 3
  console.log(args); // [ 2, 3 ]
  // 形参的数量不包括剩余参数个数
  console.log(foo.length); // 1
}

foo(1, 2, 3)
复制代码

注意:rest参数必须在最后面, 否则会报错。

2. arguments和形参的关系

2.1 严格模式下

arguments表示实参类数组对象,它总是能跟着具名形参的变化而变化,相当于和形参存在一种映射关系,改变一个,另一个会自动改变。

function fn(a, b) {
  console.log(arguments[0]); // 1 
  console.log(arguments[1]); // 2

  a = 10;
  b = 20;
  // 改变了形参的值,arguments自动更新
  console.log(arguments[0]); // 10
  console.log(arguments[1]); // 20

  arguments[0] = 100;
  arguments[1] = 200;
  // 改变了arguments的值,形参自动更新
  console.log(a); // 100
  console.log(b); // 200
}

fn(1, 2)
复制代码

2.2 严格模式

当函数有默认参数写法时,改变a和b的值,不会对arguments对象造成影响,并且不能进入严格模式。

function fn(a, b) {
  'use strict';
  console.log(arguments[0]); // 1
  console.log(arguments[1]); // 2

  a = 10;
  b = 20;
  // 改变了形参的值,但不影响arguments
  console.log(arguments[0]); // 1
  console.log(arguments[1]); // 2

  arguments[0] = 100;
  arguments[1] = 200;
  // 改变了arguments的值,但不影响形参
  console.log(a); // 10
  console.log(b); // 20
}

fn(1, 2)
复制代码

2.3 默认参数的形参和arguments没有关系

当函数的任意一个形参具有默认值时,所有的形参和arguments就不再存在映射关系。并且此时不能进入严格模式,否则会报错。

function fn(a, b=3) {
  console.log(arguments[0]); // 1
  console.log(arguments[1]); // 2

  a = 10;
  b = 20;

  console.log(arguments[0]); // 1
  console.log(arguments[1]); // 2

  arguments[0] = 100;
  arguments[1] = 200;

  console.log(a); // 10
  console.log(b); // 20
}

fn(1, 2)
复制代码
function fn(a, b=3) {
  'use strict';
  console.log(arguments[0]); // 1
  console.log(arguments[1]); // 2

  a = 10;
  b = 20;

  console.log(arguments[0]); // 1
  console.log(arguments[1]); // 2

  arguments[0] = 100;
  arguments[1] = 200;

  console.log(a); // 10
  console.log(b); // 20
}

fn(1, 2) 
// 报错:
// SyntaxError: Illegal 'use strict' directive in function // with non-simple parameter list
复制代码

转载于:https://juejin.im/post/5cf9ff2be51d4556dc2935f6

猜你喜欢

转载自blog.csdn.net/weixin_33696106/article/details/91466001