zoukankan      html  css  js  c++  java
  • JavaScript的函数(三)

    函数也是对象,拥有属性和方法,就类似普通对象那样。
    1,length属性

    arguments.lenght 表示传入实参的个数。

    函数的length属性时只读属性,代表形参的个数。可以用arguments.callee.length表示:

    function check(args){
         var actual = args.length;
         var expected = args.callee.length;
         if(actual != expected){
             throw Error(`Expected ${expected} ,args got ${actual}`)
         }
     }
     function f(x,y,z){
         check(arguments);
         return x+y+z;
     }
     f(1,2)

    2.call()和apply()方法

    可以将call()和apply()看做是某个对象的方法,里面的第一个实参是要调用函数的母对象,即上下文,在函数体内是通过this来获得对它的引用。例如:

    f.call(o)
    f.apply(o)

    对象o来调用函数f();

    f.call(o,1,2)
    f.apply(o,[1,2])

    call和apply类似的功能,唯一不同就是传入实参的形式,call是单个传,apply是以数组的形式传入。

    3,bind()方法
    var g = f.bind(o);
    将函数f绑定到o上面,可以通过g(x)来调用o.f(x);

    4,toString方法

    foo.toString()
    "function foo(x,y){
         return x+y;
     }"
    Date.toString()
    "function Date() { [native code] }"

    5,构造函数

    var f = new Function('x','y','return x+y;')

     Function()构造函数可以传入任意数量的字符串实参,最后一个实参所代表的文本就是函数体。

    6,可调用的对象

    Window.alert()

    Document.getElementById()

    RegExp对象
    本质上不是Function对象,

    这里:检测一个对象是不是函数,最好检测它的class属性

    Object.prototype.toString.call(foo)
    "[object Function]"

    7,函数式编程

    map()和reduce()来实现一个数组的平均值和标准差

     var data = [1,2,3,4,5];
     var sum = function(x,y){return x+y};
     var squarte = function(x){return x*x};
     var mean = data.reduce(sum,0)/data.length;
     var deviations = data.map(function(v){return v - mean});
     var stddev = Math.sqrt(deviations.map(squarte).reduce(sum,0)/data.length)
    
    mean
    3
    stddev
    1.4142135623730951

    如果一味的用for循环,那么就不是函数式编程了,reduce(cb,originItem)。

    8,高阶函数
    即操作函数的函数。它接收一个或者多个函数作为参数,并返回 一个新函数。

    function not(f){
         return function(){
             var result =  f.apply(this,arguments);
             console.log("this",this)
             return !result;
         }
     }
    
     var even = function(x){
         return x%2 === 0;
     }
     var odd = not(even);
     [1,1,3,5,5].every(odd);

    还有一个更常见的例子:f(g())

     function compost(f,g){
         return function(){
             return f.call(this,g.apply(this,arguments));
         }
     }
  • 相关阅读:
    设置MYSQL允许用IP访问
    EasyUI中那些不容易被发现的坑——EasyUI重复请求2次的问题
    Oracle初级性能优化总结
    Asp.Net MVC3.0网站统计登录认证的在线人数
    App.config和Web.config配置文件的配置节点的解析
    App.config和Web.config配置文件的自定义配置节点
    Asp.Net Web API 2第十八课——Working with Entity Relations in OData
    win7凭据管理、win7多用户远程登录、主机头设置、nuget.org无法访问
    Asp.Net Web API 2第十七课——Creating an OData Endpoint in ASP.NET Web API 2(OData终结点)
    C#基础知识系列八(const和readonly关键字)
  • 原文地址:https://www.cnblogs.com/tangjiao/p/8984675.html
Copyright © 2011-2022 走看看