javascript 函数详解2 -- arguments

页面导航:首页 > 网络编程 > JavaScript > javascript 函数详解2 -- arguments

javascript 函数详解2 -- arguments

来源: 作者: 时间:2016-02-05 11:06 【

今天我们接着上篇文章来继续javascript函数这个主题。今天要讲的是函数对像中一个很重要的属性--arguments。相关阅读:javascript 函数详解1 -- 概述javascript 函数详解2 -- argumentsJavascript

\

今天我们接着上篇文章来继续javascript函数这个主题。今天要讲的是函数对像中一个很重要的属性--arguments。

相关阅读:<喎"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KCmphdmFzY3JpcHQguq/K/c/qveIxIC0tILjFyvY8YnI+CmphdmFzY3JpcHQguq/K/c/qveIyIC0tIGFyZ3VtZW50czxicj4KSmF2YXNjcmlwdCC6r8r9z+q94jMgLS0gdGhpc7bUz/MKPGJyPgpKYXZhc2NyaXB0ILqvyv3P6r3iNCAtLSC6r8r9tcTG5Mv7yvTQ1Ao8YnI+CkphdmFzY3JpcHQguq/K/c/qveI1IC0tILqvyv221M/ztcTE2rK/uq/K/Qo8YnI+Cgo8L2Jsb2NrcXVvdGU+CjxwPmFyZ3VtZW50c7bUz/Oyzsr9yv3X6dL908M8L3A+CjxwPmFyZ3VtZW50c8rHuq/K/bbUz/PE2rK/0ru49rHIvc/M2MritcTA4Mr91+m21M/zo6zV4rj2ttTP89bQsPy6rMHLy/nK9Lqvyv21xLLOyv3B0LHto6zNrMqxu7mw/Lqs0ru49ta4z/K6r8r91K3QzbbUz/O1xNa41esuPC9wPgo8cD7O0sPHz8jAtMzWwtvPwmFyZ3VtZW50c9bQtcSyzsr9yv3X6aOsztLDx7/J0tTWsb3TyrnTw1tpbmRleF21xMDgJiMyMDI4NDu3w87Kyv3X6bXEt73KvcC0t8POyrLOyv2ho9Kq1ebV/cDtveLV4szY0NSjrM7Sw8fPyNKq1qq1wGphdmFzY3JpcHS1xLqvyv2yu7nY0MTE47Srtd21xLLOyv2jrNLyzqrU2rX308O6r8r9tcTKsbryo6zU2rqvyv3E2rK/y/u908rVtcTKx9K7uPayzsr9yv3X6aOs0rK+zcrHy7WjrMDtwtvJz6OsztLDx7/J0tTU2sn5w/e6r8r9tcTKsbryv8nS1LK7yfnD98jOus6yzsr9o6y1q8rH1Nq199PDtcTKsbryyLS/ydLUtKu13cjO0uK24LXEss7K/aGjPC9wPgo8cD7I58/CtPrC68q+wP2jujwvcD4KCjxwcmUgY2xhc3M9"brush:java;"> function sayHi(){ var name = arguments[0]||"default name", greeting = arguments[1]||" how are you"; console.log("Hello "+name+","+ greeting); } //不传参数调用 sayHi(); //传一个参数调用 sayHi("John"); //传两个参数调用 sayHi("John","你好!");

执行结果:

\

接下来我们在看另外一段代码,来探索arguments对象与参数列表的引用关系。

    function um(op1,op2){
    arguments[1] = 20;
    console.log(arguments[0]+op2);
    }
    dosum(1,1);

我们先预测下执行结果,2还是21?

真正的执行结果如下:

\

针对上面的执行结果我们可以抽象下argument与参数数组间的引用管理模型。

\

arguments callee属性

arguments callee属性是一个指向函数对象的指针,灵活使用该属性可以大大降低代码与函数名的耦合度,同时可以使代码更加灵活。

降低耦合度一般在递归运算中体现比较明显。

如下代码:

    function factorial(num){
    if(num<=1){
    return 1;
    } else{
    return num*factorial(num-1);
    }
    }

上面这段代码最大的缺点就是与函数名factorial的耦合,正如我们一开始讲的,函数名是一个指针,也就是一个变量,如果我们能保证该变量一直引用该函数对象,那么这段代码就一直能返回我们所期望的结果。一旦该变量指向了其他对象,上面的代码就会出错,这时候 arguments.callee就能够发挥作用了。修改如下:

    function factorial(num){
    if(num <= 1){
    return 1;
    }else{
    return num * arguments.callee(num -1 );
    }
    }

这样,这个函数对象的计算结果就与函数名factorial没有关系了,就算之后做如下操作,我们依旧可以得到正确的结果。

var afunc = factorial;

factorial = null;

afunc(3); // 同样可以正确返回6

通过arguments.callee的另外一个比较灵活的应用如下:

    var otherfunc = (function(){
    console.log("do something cool");
    return arguments.callee;
    })();

上面代码所做的操作时立即执行了一个函数,并返回该匿名函数的引用,赋值给otherfunc,这时我们就可以在其他地方继续调用这个函数。

这样的用法是我在项目中遇到的,页面初始化时要做一些操作,也就是页面加载完成后立即执行该函数,但是这个函数并不是一次性的,我们还需要在该页面的其他时候来调用这个函数,上面的代码,个人会比先声明一个函数,然后在页面加载完成后调用要优雅一些,见仁见智罢了。

原文来自:javascript 函数详解2 -- arguments

Tags:

文章评论

最 近 更 新
热 点 排 行
Js与CSS工具
代码转换工具

<