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

    ,1,在javascript中,函数即对象。函数里面的参数可以是个函数,例如:

    data.sort(function(a,b){return a-b;})
    

      函数的返回值,return语句导致函数停止执行,并返回它的表达式(如果有的话)的值给调用者。如果没有返回值的函数,就是没有return,就是返回 undefined值给调用者。没有返回值的函数有时候称为过程。

    2,嵌套函数:

    有趣之处在于他的变量作用域规则。就是函数里面可以嵌套一个函数。

    3,函数调用:

    作为函数;

    作为方法(无非是保存在一个对象属性里面的javascript函数);

    作为构造函数;

    通过它们的call()和apply()方法间接调用。

    方法和this关键字是面向对象编程范例的核心。任何函数只要作为方法调用,实际上都会传入一个隐式的实参---这个实参是一个对象。方法调用的母体就是这个对象。

    var o = {
        m:function(){
            var self = this;
            console.log(this === o);
            f();
            function f(){
                console.log(this);
                console.log(self === o);
            }
        }
    }
    执行 o.m()
    结果:
    true
    false
    true
    

     这里说明一点:嵌套函数里面的this指向问题:this的值是全局对象或者undefined,如果要用外层函数的上下文环境,则需要将this的值保存在一个变量self里面。 

    4,方法链:

    当方法的返回值是一个对象,这个对象还可以再调用它的方法,形成链式的调用方式。

    当方法并不需要返回值时,最好直接返回this。如果 在设计的API中一直采用这种方式(每个方法都返回this)。使用API就可以进行“链式调用”,不要将方法的链式调用和构造函数的链式调用混为一谈。

    5,构造函数的调用:

    首先:如果构造函数没有形参,可以省略圆括号,

    var o = new Object();
    var o = new Object;
    

      这个两种写法是等价的。其次:new o.m();调用上下文不是o,而是这个新对象作为调用上下文。
           最后:函数的返回值,构造函数通常不使用return关键字。

    6,可变长的实参列表:实参对象
    当:实参列表 > 形参个数,没有办法获得未命名值的引用。参数对象解决了这个问题。在函数体内,arguments是指向实参对象的引用。实参对象是一个类数组对象。可以通过下标来访问实参值。不用非得通过名字来得到实参。
    实参对象有一个重要的用处:就是让函数可以操作任意数量的实参。例如:

    function max(){
        var max = Number.NEGATIVE_INFINITY;
        for(var i = 0;i<arguments.length;i++){
            if(arguments[i] > max){
                max = arguments[i];
            }
        }
        return max;
    }
    var largest = max(1,10,100,2,3,1000,4,5,1003);//1003
    

      类似这种函数可以接收任意个数的实参。也称为:“不定实参函数”。

    remember:arguments并不是真正的数组,而是一个实参对象。可以这样理解:它是一个对象,只是碰巧拥有以数字为索引的属性。

    实参对象还定义了callee和caller属性。arguments.callee()属性指向当前正在执行的函数。caller是非标准的,单大多数浏览器都实现了这个属性。实用场景:匿名函数中通过callee来递归调用自身。

    var factorial = function(x){
        if(x <= 1) return 1;
        return x*arguments.callee(x-1);
    }
    factorial(10) //这里就是一个10*9*8*7*6*5*4*3*2*1的方法,用的是递归
    
    匿名函数的实现方式:
    (function(x){
        if(x <= 1) return 1;
        return x*arguments.callee(x-1);
    }(10))     //同样也是可以实现该递归的方法
    

    7.将对象属性用作实参: 

         当一个函数包含超过三个形参时,最好通过名/值对的形式来传入参数。这样参数的位置就无关紧要。而且这种写法允许在函数中设置省略参数的默认值。

     

  • 相关阅读:
    char与unsigned char的区别
    C语言 —— sprintf()函数
    char *s 与 char s[ ]的区别
    打印不同对象的字节表示 ( 对int*强制转换成unsigned char*的理解 )
    洛谷P2242 公路维修问题(Road)
    洛谷P1209 [USACO1.3]修理牛棚 Barn Repair
    洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication
    洛谷P2246 SAC#1
    Bzoj4300 绝世好题
    Uva1398 Meteor
  • 原文地址:https://www.cnblogs.com/tangjiao/p/8977256.html
Copyright © 2011-2022 走看看