1. 程式人生 > 實用技巧 >理解函式呼叫_arguments物件作為函式引數的別名

理解函式呼叫_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)將無法再使用它。