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;
  • 相关阅读:
    lr 增强窗格中,如何生成调试信息?
    lr 自带的例子,如何进行关联,通过代码的函数进行实现
    lr11 录制脚本时候,无法自动启动ie,查了网上很多方法都未解决?
    loadrunner11 录制脚步不成功,在录制概要出现“No Events were detected”,浮动窗口总是显示“0 Events”,解决办法
    loadrunner11 安装及破解教程来自百度文库
    安装loadrunner11 ,出现如下错误如何解决?
    回收站数据删除了,如何进行恢复?
    网管工作方面——————打印机删除了然后开机重启他依然存在,如何解决
    Windows 不能在 本地计算机 启动 SQL Server 服务 错误代码126
    Sorry, the page you are looking for is currently unavailable. Please try again later. Nginx
  • 原文地址:https://www.cnblogs.com/wolfocme110/p/4157692.html
Copyright © 2011-2022 走看看