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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值