zoukankan      html  css  js  c++  java
  • js 匿名函数 js-函数定义方法

    1.任何函数都是有返回值的,没有返回值的,在某些语言里称之为过程例如PL/SQL

    2.js中的函数如果没有return 关键字指明给出的返回值,那么当调用完函数后,会返回“undefined"关键字

    3.js中传递的参数不会检测类型,如果对类型十分明确,请用typeof()来对传入的参数进行检测。

    4这种匿名函数会在生成后,直接调用:

    alert((function(x){return x*x})(10));

    格式大概为:第一个括号内包含函数定义,第二个括号为传入函数的参数。

    5.参数的设定可以可选,如果参数可选了,那么应该为其摄人一个默认值,可选的参数最后在参数列表的最后一位。

    function copyPropertype(object, array) {
        array = array || [];
        for (var propertype in object) {
            array.push(propertype)
        }
    }

    6.arguments,arguments是一个标识符,不是保留字,如果在函数体内定义了相同的变量名,那么会隐藏对arguements的引用。同时也要注意到arguments是一个类似于数组的对象。对命名参数的引用可以使用参数名也可以使用argument[n]的方式来进行引用。

      callee属性,用来引用这在执行的函数,允许对没有命名的函数递归的调用自身例如:

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

    7.为了便于对函数的调用,可以把函数的参数看为一个对象,然后通过对对象的属性,来获取穿入的值,这样就便于进行对函数的调用。

    function arraySort(fromArr, fromStart, toArr, toStart, length) {
        //do something
    }
    function userObject(args){
        arraySort({
                    args.fromArr,
                   args.fromStart,
                   args.toArr,
                   args.toStart,
                   args.length
        })
    }

    8.在js中,函数不仅可以被定义跟调用,而且它还是一种数据类型,因此函数还能被赋值给某个变量。函数的函数名并没有什么意义,它只是用来引用函数的变量名而已。

      函数不仅可以赋值给全局变量外,还能赋值给某个对象的属性,通过属性来调用函数。

      函数可以没有函数名,只要有保存该函数的引用的位置即可。例如array[0]=function(){};

    9.在方法中,用来调用方法的对象成为this的指向

    var obj = {
        oper1: 1,
        oper2: 1,
        result: function () {
            return this.oper1 + this.oper2;
        }
    };

    10.当一个函数而不是对象的方法而言,this的指向总是全局变量。例如:

    var name = "out";
    function getName() {
        var name = "in1";
        function getInName() {
            var name = "in2";
            return this.name;
        }
        alert("嵌套函数:" + getInName());
        return this.name;
    }
    alert(getName());
    alert(obj.result());

    11.函数是一个对象。具有对象的属性跟方法。

      11.1length属性。该属性只读。该属性与arguments.length不同,该属性时函数需要传递的参数的个数,具体为,函数定义时的参数个数。而arguments.length则是函数调用时传递进来的参数的个数。

    function check(args) {
        alert(args.length);
        alert(args.callee.length);
    };
    function f(x, y, z) {
        check(arguments);
    };
    f(1, 2);

      实际需要3个,但是只传入了2个。

      11.2.可以定义自己的函数属性。如果该函数在使用过程中有一个保值不变的值,Function的属性定义比全局变量更加方便。

    function func() {
        return func.count++;
    }
    func.count = 1;
    alert(func());
    alert(func());

    12.子类,超类。

      

    function rect(w, h) {
        this.width = w;
        this.height = h;
    }
    rect.prototype.area = function () {
        return this.x * this.y;
    }
    function PositionRect(x, y, w, h) {
        //这个是调用rect的构造方法
        rect.call(this, w, h);
        this.x = x;
        this.y = y;
    }
    //这个是重点,原型变为new rect
    PositionRect.prototype = new rect();
    //构造函数PositionRect
    PositionRect.prototype.constructor = PositionRect;
    var P = new PositionRect(1, 2, 33, 22);
    alert(P.area());
    alert(P.constructor);

      在js中常见一个子类并不像创建一个直接继承的Object的类那样明显。首先,从子类的构造函数调用超类的构造函数是一个问题。当这么做的时候要注意,超类的构造函数是作为新创建的对象的一个方法调用的。接下来,设置子类构造函数函数原型对象需要一些技巧,必须显示地把这个原型对象创建为超类的一个实例,然后显示地设置原型对象的constructor属性。另外还要删除超类构造函数在原型对象中创建的所有属性,因为重要的是原型对象从它的原型那里继承的那些属性。

     12.2构造函数链。

      如果构造函数需要显式地调用超类的构造函数,这叫做构造函数链。在创建子类的时候很常见。如果只有一个子类,可以为子类的原型对象添加一个名位superclass的属性。从而简化构造函数的语法。例如

    PositionRect.prototype.superclass=rect;

    和属性定义相比,构造函数链语法更简单:

    function PositionRect(x, y, w, h) {
        this.superclass(w, h);
        this.x = x;
        this.y = y;
    }

    注意,超类构造函数通过this对象地显式地调用。这意味着不再需要使用call()或者apply()来把超类构造函数作为该对象的方法来调用。

    注意:这种技术只在简单地继承层次才起作用,如果B是A的子类,C又是B的子类,B和C都使用这种superclass方法,当创建c的实例时,this.superclass引用B(),B()构造函数将无线递归。除了简单的子类外,其他的继承都需要用函数构造方法。

    13.调用父类的被覆盖的方法:

      可以用superClass.prototype.method.apply(子类)

    14.类别识别:

      可以通过 instanceOf来测试是否是一个实例。注意对象是它自己的类地一个实例,也是任何超类的一个实例。因此,对于任何对象o,o instanceof Object总是为true,有趣的是instanceof对函数也邮箱,因此对任意函数f,下面的表达式都为true:

      typeof f=="function"
    
      f instanceof Function
    
      f instanceof Object

    如果要测试对象是否是一个具体的类地一个实例,以及是否不是某个子类的实例,可以查看对象的constructor属性。

      var d=new Date();
    
      var isobject=d instanceof Object;
    
      var realobject=d.constructor==Object;
  • 相关阅读:
    使用CNN和Python实施的肺炎检测
    使用OpenCV和Tensorflow跟踪排球的轨迹
    使用PyMongo查询MongoDB数据库!
    Pandas的crosstab函数
    日记9----web专用
    日记8----windows操作系统专用
    日记7----Java专用
    句柄类
    代理类
    C++ 计算机程序设计(西安交大mooc)
  • 原文地址:https://www.cnblogs.com/wolfocme110/p/4157692.html
Copyright © 2011-2022 走看看