zoukankan      html  css  js  c++  java
  • javascript函数

    Function对象

    js中一切都是对象,函数也是对象,函数名是引用函数定义对的变量。

    一.函数的定义

     1 //函数定义的三种方法
     2     //声明方式
     3     function sum(x,y){
     4         return x+y;
     5     }
     6     sum(1,2);//调用sum函数,求和
     7     //函数名和函数定义都被提前,在调用前后位置定义都行
     8     
     9     //函数直接量
    10     var sum = function(x,y){
    11         return x+y;
    12     }
    13     sum(1,2);//调用sum函数,求和
    14     //仅函数名声明变量会提前,函数定义留在本地,必须定义在调用前
    15     
    16     //使用new创建函数类型对象
    17     var sum = new Function("x","y","return x+y");

    二.匿名函数

      定义时,不指定函数名的函数  

    /* 匿名函数自调:
        定义完,立即执行,执行完立即释放
        只有确定函数只执行一次时使用
    */
    (function(x,y){alert(x*y)})(2,3);
    var tens = (function(x) {return x*x}(10));
    //自调:定义在哪,就在哪执行,不提前
    
    /* 匿名函数回调
        将函数作为队象传递给另一个函数,由另一个函数自主决定在需要时调用
    */
    var arr=[1,12,123,3,2,23];
    arr.sort(function(a,b){return a-b;});//比较器函数回调
    console.log(arr);

    三.arguments对象

      arumengts: 在函数调用时, 会自动在该函数内部生成一个名为 arguments的隐藏对象。

      标识符arguments是指向函数实参的引用,实参对象是一个类数组对象。每个实参对象都包含以数字为索引的一组元素以及length属性,但它毕竟不是真正的数组。

      js语法不支持重载,但可用arguments对象模拟重载效果。

      arguments[i]  获得传入的下标为i的的参数值

      arguments.length  获得传入参数的个数

     1 function calc(   ){
     2     //如果用户传入一个参数,求平方
     3     if(arguments.length==1){
     4         alert(arguments[0]*arguments[0]);
     5     }else if(arguments.length==2){
     6     //如果用户传入两个参数,就求和
     7         alert(arguments[0]+arguments[1]);
     8     }
     9 }
    10 calc(4); //16
    11 calc(4,5); //9
    12 /*无论用户传入几个数字,都可以求和*/
    13 function add(){
    14     //遍历arguments中每个元素,并累加
    15     for(var i=0,sum=0;i<arguments.length;sum+=arguments[i++]);
    16     return sum;//返回和
    17 }
    18 
    19 alert(add(1,2,3)); //6
    20 alert(add(1,2,3,4,5,6)); //21

      即使定义了参数变量,arguments对象同样会收到所有参数值

      arguments 的 callee 和 caller 属性

        在ECMAScript 5 严格模式中,这两个属性的读写都会产生一个类型错误。

        callee: 当函数被调用时,它的arguments.callee对象就会指向自身,也就是一个对自己的引用。

    1 (function aCallee() {  
    2   console.log(arguments.callee);  
    3 })();//FF 中返回 aCallee()

         1. callee 属性在某些时候会非常有用,比如匿名函数中通过 callee 来递归地调用自身

    1 var factorial = function(x){
    2   if(x <= 1) return 1;
    3   return x * arguments.callee(x-1);
    4 }
    5 factorial(4);// 24

        2. caller: 在一个函数调用另一个函数时,被调用函数会自动生成一个caller属性,指向调用它的函数对象。如果该函数当前未被调用,或并非被其他函数调用,则caller为null。

    1 function testCaller() {  
    2   console.log(testCaller.caller);     
    3 }  
    4 function aCaller() {  
    5     testCaller();  
    6 }   
    7 aCaller();  // FF 下输出为 aCaller()

     四. 函数的属性

      1.length 属性

        在函数体内, arguments.length 表示传入函数的实参的个数。而函数本身的 length 属性(只读),代表函数的形参个数,即在函数调用时期望传入函数的实参个数。  

    1 (function check(args){
    2   console.log("实参真是个数" + arguments.length + "; 期望实参个数:" + arguments.callee.length);
    3 })(2,3,4,5); // 实参真是个数4; 期望实参个数:1

       2. prototype 属性 指向原型对象的引用

  • 相关阅读:
    uva 1606 极角扫描
    Codeforces Round #304 (Div. 2) 题解
    Codeforces Round #306 (Div. 2) 题解
    Codeforces Round #299 (Div. 2) 题解
    树链剖分专题
    bzoj 1036: [ZJOI2008]树的统计Count
    bzoj 1007: [HNOI2008]水平可见直线
    bzoj 1003: [ZJOI2006]物流运输trans
    Codeforces Round #301 (Div. 2) 题解
    bzoj 1026: [SCOI2009]windy数
  • 原文地址:https://www.cnblogs.com/Medeor/p/4889928.html
Copyright © 2011-2022 走看看