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.将对象属性用作实参: 

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

 

 

 

posted @ 2018-05-01 20:11  tangjiao_Miya  阅读(190)  评论(0编辑  收藏  举报