• js_function


    /**
    * 1.函数定义
    * 函数定义最常用的方法是调用function语句。该语句由关键词function构成,紧随其后跟的是函数名(可选)、参数列表(使用括号括起来,括号必选,列表可选,参数使用逗号分割开来)、函数体(大括号括起来,大括号必选,内容可选)。
    */
    //函数可以有返回值,使用return 语句;也可以没有返回值
    function test_return(){
    return window.alert("test_call");
    }

    /**
    * 2.使用Function()构造函数和new定义函数。
    * 下面的定义等价于 function f(x, y){return x*y;}
    * Function构造函数可以接受任意多个字符串参数。它的最后一个参数是函数的主体,其中可以包含任何javascript语句,语句之间使用分号分割,其他的参数都是说明函数的参数的。
    * 注意:传递给构造函数Function()的参数中没有一个用来说明函数名的,所以也成“匿名函数”。
    */
    var f = new Function("x", "y", "return x*y");

    /**
    * 3.使用函数直接量定义函数
    * 函数直接量是一个表达式,它可以定义匿名函数,结尾有分号。函数直接量的语法和function语句非常相似,只不过他被用作表达式,而不是语句,而且也无需制定函数名。
    * 函数直接量表达式指定的函数可以存储在一个变量中,可以传递给其他的函数甚至被直接调用。
    */
    function f1(x, y){return x*y;} //使用function语句定义
    var f2 = new Function("x", "y", "return x*y;"); //使用Function和new定义
    var f3 = function(x, y){return x*y;}; //使用函数直接量定义,赋值给变量f3

    a[0] = function(x){return x*x;} //定义一个函数并保存它
    a.sort(function(a, b){return a-b;}); //定义一个函数,把它传递给另一个函数
    var tensquared = (function(x){return x*x;})(10); //定义一个函数并调用它,把结果赋值给一个变量

    /**
    * 4.作为数据的函数
    * 函数可以被赋值给变量、存储在对象的属性中或存储在数组的元素中、传递给函数等等。
    * 下面创建了一个函数对象,并把这个对象赋值给了变量square。实际上,函数名并没有什么实质意义,它不过是用来存放函数的变量的名字。
    */
    function square(x){return x*x;}

    /**
    * 函数作为数据的例子
    */

    //我们定义了四个简单的函数
    function add(x, y){return x+y;}
    function substract(x, y){return x-y;}
    function multiply(x, y){return x*y;}
    function divide(x, y){return x/y;}
    //下面这个函数使用上面某个函数作为参数,同时传入两个参数,返回运算结果
    function operate(ope1, ope2, ope){
    return ope(ope1, ope2);
    }
    //可以使用上面的函数计算(2+3)-(4*5)
    var i = operate(operate(add, 2, 3), operate(multiply, 4, 5), substract);

    //下面把函数保存到数组中,使用函数直接量形式定义
    var opes = new Object();
    opes['add'] = function(x, y){return x+y;};
    opes['substract'] = function(x, y){return x-y;};
    opes['multiply'] = function(x, y){return x*y;};
    opes['divide'] = function(x, y){return x/y;};
    opes['pow'] = Math.pow;

    //以下的函数将运算符作为参数,在数组中检索这个运算符,然后对运算符调用检索到的函数。注意调用这个运算符函数的语法。
    function operate2(ope1, ope2, opt_name){
    if(opes[opt_name]==null)return "unknown operator";
    else return opes[opt_name](ope1, ope2);
    }

    //下面计算("hello" + " " + "world");
    var j = operate2("hello", operate2(" ", "world", "add"), "add");

    /**
    * 5.arguments标识符
    * javascript函数的主体实在局部作用域中执行的,该作用域不同于全局作用域。这个新作用域是通过把调用对象添加到作用域链的头部
    * 创建的。因为调用对象是作用域链的一部分,所有在函数体内可以把这个对象属性作为变量来访问。用var语句声明的局部变量创建后作为调用对象的属性,而且函数的形式参数也可用于对象的属性。
    * 除了局部变量和形式参数外,调用对象还定义了一个特殊属性,名为arguments。这个属性引用了另外一个特殊的对象——Arguments对象。该对象属于函数调用环境。
    * 在一个函数体内,标识符arguments具有特殊含义。它是调用对象的一个特殊属性,用来引用Arguments对象。Arguments对象就像数组,可以按照数字获取传递给函数的参数值。
    * 但是它并非真正的Array对象。Arguments对象也定义了callee属性。
    *
    * 尽管定义函数时有固顶数目的命名参数,但是当调用这个函数时,传递给它的参数数目却可以是任意的。arguments属性支持[]运算符。
    * 注意:中括号里面是索引值,从0开始。arguments[]可以完全地存取那些实际参数值,即使某些参数没有被定义。如arguments[0]表示第一个形式参数的值。
    *
    * 使用arguments[]可以帮助我们编写能够接受任意数目实际参数的函数。
    *
    * arguments[]不是数组,它表示的是Arguments对象。Arguments对象有一个非同寻常的特性。当函数定义了形式参数时,arguments[]里面存放的元素就是形式参数的值。arguments[]和形式参数不过是引用同一变量的两种不同方法。
    * 通过任何一种方式改变值都会影响两一种方式的值。
    *
    * 下面定义了一个匿名函数(第一个括号内的函数),函数体首先输出参数值,然后赋值null,再次输出参数值。定义函数后调用它,同时传递给它一个实际参数5.
    */
    (function(x){window.alert(x); x=null; window.alert(x);})(5); //第一次输出是5,第二次输出是null

    /**
    * 6.callee属性
    * Arguments对象除了有arguments属性,还有callee属性,用来引用当前正在执行的函数。这对匿名函数调用自身非常有用。
    * 下面是一个计算阶乘的匿名函数.
    */
    var v = function(x){if(x<=1)return 1; else return x*arguments.callee(x-1);}
    window.alert(v(5));

    /**
    * 7.Function函数对象
    * 函数是一种javascript对象,就行String对象和Date对象一样。同样具有属性和方法。
    * Function对象具有length,这是个只读属性,该属性确切地说明了一个函数声明的形式参数的个数。不同于arguments的属性,arguments.length表示函数实际接收到的参数个数。
    * 下面的check函数会检测函数接收到的实际参数个数和定义的参数个数是否相等,不等的话抛出错误。f函数应用了check函数。最后输出应该报错。
    * 另外,Function对象还有一个prototype属性,表示预定义的原型对象。原型对象在使用new运算符把函数作为构造函数时起作用。它在定义新的对象类型时起着非常重要的作用。
    */
    function check(args){
    var actual = args.length;
    var expected = args.callee.length;
    if(actual != expected){
    throw new Error("Wrong number of arguments: expected:"+expected+" ;but actually passed "+actual);
    }
    }

    function f(x, y, z){
    check(arguments);
    return x+y+z;
    }

    window.alert(f(2,5));

    /**
    * 8.Function对象的apply方法和call方法
    * 所有函数都有这两个方法。使用这两个方法就像用其他对象的方法医用。call()和apply()的第一个参数都是要调用的函数的对象,在函数体内这一参数是关键字this的值。call()的剩余参数是传递给要调用的函数的参数。
    */
    var o = new Object();
    function f(x, y){return x+y;}
    o.m = f;
    window.alert(o.m(2,5)); //以上两行代码等价于f.call(o,2,5);

    //apply()方法的参数和call()方法类似,只是传递给函数的参数时候数组指定的。如上面可以写成f.apply(o,[2,5]);

  • 相关阅读:
    关于网络安全攻防演化博弈的研究小议
    入侵检测技术框架总论【课题笔记】
    态势提取的前置基础技术:数据集成、数据规约、数据融合
    网络安全态势感知框架小议
    入侵检测基本准则(Basic principles of intrusion detection)【v1.0】
    Research on collection technology and countermeasure technology of system behavior log for HIDS,面向HIDS的日志采集技术与对抗技术研究
    Tomcat(二):Tomcat处理一个Http请求
    Tomcat(一):Tomcat启动时加载web.xml
    SpringMVC(十七):Web.xml初始化流程源码分析
    设计模式(九)责任链(Chain of Responsibility)
  • 原文地址:https://www.cnblogs.com/beidao/p/2467619.html
Copyright © 2020-2023  润新知