Javascript 的 arguments 参数

  arguments 参数是调用函数时传递给函数的所有显式参数的集合。它通过隐式的方式传递到函数内部。

  这个arguments 对象是一个拥有长度和可以以索引的方式取单个的参数的类似于数组的集合,它并不是一个真正的数组,因为它无法调用数组的方法(sort等)。

  在JavaScript的非严格模式下,arguments 对象作为函数parameters的别名,修改arguments对象会引起对应的函数参数(function parameter)的值发生改变。

这就是说,如果修改arguments[0],函数的第一个参数(parameter)的值也会改变,如下所示:

function infiltrate(person) {
  assert(person === 'gardener',
    'The person is a gardener');
  assert(arguments[0] === 'gardener',
    'The first argument is a gardener');
  arguments[0] = 'ninja';
  assert(person === 'ninja',
    'The person is a ninja now');
  assert(arguments[0] === 'ninja',
    'The first argument is a ninja');
  person = 'gardener';
  assert(person === 'gardener',
    'The person is a gardener once more');
  assert(arguments[0] === 'gardener',
    'The first argument is a gardener again');
}

infiltrate("gardener");

  调用函数infiltrate时,arguments[0]和参数person的值都是'gardener',当把arguments[0]赋值为'ninja'时,person的值也变成了'ninja';再次把person的值改为'gardener'时,arguments[0]的值跟着变回'gardener'。

  由于把arguments对象作为函数参数的别名使用会引起迷惑,所以JavaScript提供了一种方式来禁止这样做——严格模式

 

"use strict";

function infiltrate(person){
  assert(person === 'gardener','The person is a gardener');
  assert(arguments[0] === 'gardener', 'The first argument is a gardener');
  arguments[0] = 'ninja'; 
  assert(arguments[0] === 'ninja','The first argument is now a ninja');
  assert(person === 'gardener','The person is still a gardener');
}

infiltrate("gardener");

使用严格模式后,在执行arguments[0] = 'ninja'时,只改变了arguments[0]的值,person的值不会发生改变,还是原来的"gardener"。

注:代码中使用的assert函数为自定义函数。

原文地址:https://www.cnblogs.com/Saints/p/6002376.html