理解函数调用_arguments对象作为函数参数的别名

<!DOCTYPE html>
<html lang="en">
<head>  
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../unitl/test.js"></script>
    <style>
        #results li.pass {color:green;}
        #results li.fail {color:red;}
    </style>
</head>
<body>
    <ul id="results"></ul>
</body>
<script>



    function infiltrate(person) {


        // 检查person参数的值等于gardener,并作为第一个参数被传入。
        assert(person==="gardener",'The person is a gardener');
        assert(arguments[0]=== 'gardener','The first argument is a gardener');

        //改变argument对象的值也会改变相应的参数。
        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");


</script>
</html>
    

这里可以说明arguments对象是如何作为函数参数别名的。我们定义了一个函数infiltrate,它只接受了一个参数person,接着我们调用他并传入参数gardener。可以同时通过
函数形参gardener。可以同时通过行数形参person和arguments对象访问到参数值gardener。

      assert(person==='gardener','The person is a gardener');
      assert(argements[0]==='gardener','The first argument is a gardener');
 因为arguments对象是函数参数的别名,所以如果改变了arguments对象的值,同时也会影响对应函数参数。
    arguments[0] = 'ninja';
    
   assert(person==='ninja','The person is a ninja now');
   assert(arguments[0]==='ninja',"The first argument is a ninja");

避免使用别名

      将arguments对象作为函数参数的别名使用会影响代码的可读性,因此在javaScript提供的严格模式(strict mode)将无法再使用它。
原文地址:https://www.cnblogs.com/jamal/p/14120470.html