首页 > arguments创建函数问题?

arguments创建函数问题?

(代码附后)

Q1:

  return function() {//返回值

            return func.apply(null, args.concat(Array.prototype.slice.call(arguments)));

        };

将返回一个匿名函数去调用你规定的函数,也提供了匿名函数调用时所附带的参数。这句什么意思???

Q2:这的makeFunc 函数的作用是什么?该怎么用?

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script type="text/javascript">
    function makeFunc() {
        var args = Array.prototype.slice.call(arguments);//因为arguments不是数组,是个对象,所以借用数组的slice属性,形成一个新的数组args。
        var func = args.shift();//对数组使用shift方法,删除第一个元素,并返回该元素
        return function() {//返回值
            return func.apply(null, args.concat(Array.prototype.slice.call(arguments)));
        };
    }
    </script>
</head>

<body>
</body>

</html>

Q1:
你规定的函数是func,附带的参数如下,比如你是这样运行makeFunc方法的:
var returnFunc = makeFunc(function(){console.log('my name is func in makeFunc')}, 'args');
然后你要执行func方法了,其实也就是调用returnFunc方法,这样调用 returnFunc('我将会被传到func.apply中的arguments中'),所以调用returnFunc时传入的参数就是匿名函数调用时所附带的参数

Q2:
作用是什么呢,好像是提前制作好你以后要用的函数(叫什么函数增强来着?)。就好比你有一个机器人,但是只有吃饭说话的功能,但是你想,万一你以后被人欺负了怎么办,得让你的机器人学会帮你打架啊,所以你要给你的机器人加一个打架的功能。所以你把你的机器人(func)跟材料(arguments)扔到机器人加工厂(makeFunc),结果你得到了具有打架功能的机器人(returnFunc)。十年后,你被欺负了,然后你再执行机器人的打架功能returnFunc()


我觉得你的疑问可能在为什么我要去用makeFunc()调用自己定义的函数?
但是这在实际应用中很常见,例如有一个函数example()已被多个业务场景使用,
之后出现了新的业务场景,需要给函数增加参数或回调,不可能出现这样的业务场景就去修改example(),这样可能还会影响之前调用example()的业务,从新写一个example2()来适应这样的情形显然不可取,这时就可以使用makeFunc()来扩展原来的函数example()


func.apply(args...)表示调用func函数,并把函数的this指向第一个参数,你代码中,第一个参数是null,意思是被调用的函数的this并没有用到。举个例子:

function func(args){
    this.field = args;
}
var obj = {field : 2}
func.apply(obj,[20]);
console.log(obj.field) // 20

上面的例子,表示调用了func函数,并把函数中this指向obj对象,这时候修改了obj的属性值。
另外apply函数和call函数作用基本一致,只是call函数是需要把参数一个一个写出来,以上面的用法为例,使用call应该是func.call(obj,20);这里如果有参数,在20后面添加,逗号隔开。

题目中makeFunc函数用法:

function test(args0,args1){}
makeFunc(test,args0,args1)
【热门文章】
【热门文章】