语言精粹学习之函数

1、函数对象

        就是中函数就是一个对象,每个对象有一个连接到原型对象的隐藏连接,对象字面量产生的对象连接到object.prototype,函数对象连接到Function.prototype。函数可以存放在变量、对象、数组中,可以当做参数传递也可以返回函数。

通过函数字面量创建函数   

var add=function (a,b){

            Return a+b;

};    //注意函数命名格式    花括号内为函数主体   函数可以嵌套

var函数名=function( ){  }

给函数的所有实例提供一个方法:

            函数名.prototype.方法名=function(){

            return this.方法名

}

2、调用 

函数调用时,每个函数接收两个附加参数: this, arguments

this的值取决于调用模式

 调用模式有四种:

a、方法调用模式

         函数被保存为对象的一个属性->方法        方法被调用,this 被绑定到该对象(调用表达式包含 “.” 表达式或者 【subscript】下标表达式,则其被当作一个方法来调用 )

b、函数调用模式

        当函数并非对象的属性时,就作为单纯的函数来调用:var sum=add(3,4);函数以此模式调用, this被绑定全局对象(内部函数无法使用),若此时内部函数被调用,则需要定义一个变量赋值给this,让内部函数通过变量访问this。

例如:

//给myobject增加一个double方法。
myobject.double = function (){
var that =this; //解决方法
var helper = function (){
that.value = add (that.value,that.value) ;};
helper()   //以函数的形式调用helper。
};
//以方法的形式调用double 。
my0bject.double();
document.writeln(myobject.getvalue());

c、 构造器调用

       函数前面加 new ,则得到一个隐藏连接到该函数的prototype 成员新对象,同时 this将绑定到该新对象上,使用时过程比较繁琐,细节上容易出错,因此不推荐使用。

d、Apply 调用模式

        Apply方法即构建一个参数数组并用其去调用函数,apply方法接收两个参数,其一绑定给this的值,其二即参数数组。

3、参数

       函数调用时得到arguments数组,函数可以通过该数组访问所有它被调用时传递给它的参数列表,但arguments拥有length属性但不是真数组

4、返回

       如果如果函数以new前缀方式调用,且返回值不是对象时,则返回this(该新对象)。

5、异常

       程序正常运行时出现故障,如果处理手段取决于异常的类型,那么异常处理器必须检查异常对象的name属性以确定异常的类型。

6、给类型增加方法

        通过Object.prototype/Function.prototype增加方法使得该方法对所有对象/函数可用。

例如:JavaScript并没有单独的整数类型,因此有时候只提取数字中的整数部分是必要的。JavaScript本身提供的取整方法有些丑陋。我们可以通过给Number.prototype添加一个integer方法来改善它。它会根据数字的正负来判断是使用Math.ceiling还是Math. f1oor。

Number.method ( 'integer', function ({return Math[this < 0? 'ceiling' : 'floor' ](this);});
document.writeln ( (-10 / 3) .integer ()); ll -3

JavaScript缺少一个移除字符串末端空白的方法。那是一个很容易修复的疏忽。
string.method ('trim', function ({return this. replace (/^\s+/ls+$/g, '');));
document.writeln ( ' "'+" neat  ".trim<>+ '"');

如此给函数增加方法极大提高了语言的表现力,增加与否也可以给出条件 

7、递归

 递归函数直接或间接调用自身化解问题。

8、作用域

优点:内部函数可以访问定义它们的外部函数的参数和变量(除了this和arguments)。

9、闭包

闭包,就是能够读取其他函数内部变量的函数。 例如在 javascript 中,只有函数内部的子函数才能读取局部变量,所以 闭包 可以理解成“定义在一个函数内部的函数“。在本质上, 闭包 是将函数内部和函数外部连接起来的桥梁。闭包常常用来「间接访问一个变量」。或者说,「隐藏一个变量」。
 

假设在一个支付软件中,我们需要定义用户当前的资金总量,这个数字在很多地方都需要被访问到,如果不用闭包,或许我们能用一个全局函数?
不,这样就很不妥。我们不能让别人直接访问这个变量,我们,得用局部变量了。

但是用局部变量别人又访问不到,怎么办呢?

那就可以使用闭包,暴露一个函数,实现一个共有变量

关于闭包,确实还有理解不到的地方,待日后学习再专门写一篇文章。
 

10、回调

       传统的处理不连续事件的方法面临网络上的同步请求时会导致客户端进入假死状态,此时发起异步请求提供一个当服务器的响应到达时被调用的回调函数,让异步函数立即返回,这样就不会堵塞客户端。

request =prepare_ the_request();
send _request_asynchronously (request,function  (response) {
display (response); } );

我们传递了一个函数作为参数给send_request_asynchronously函数,它将在收到响应时被调用。 

11、模块

       与前两节呼应,模块可以由函数和闭包来构造,模块是一个提供接口却隐藏状态与现实的函数或对象,通过使用函数来产生模块,可以摒弃全局变量的使用。   模块模式的一般形式是:一个定义了私有变量和函数的函数:利用闭包创建可以访问私有变量和函数的特权函数;最后返回这个特权函数,或者把它们保存到一个可访问到的地方。

12、级联

       对于一些不返回值的方法,我们返回this,而不是undefined,那么我们就可以启动以级联(链式)去操作该对象。级联用于设计一对多关系的,例如一个表存放老师的信息:表A(姓名,性别,年龄),姓名为主键。还有一张表存放老师所教的班级信息:表B(姓名,班级)。他们通过姓名来级联。级联的操作有级联更新,级联删除。使用级联后我们能移动、修改元素并添加行为。

13、套用

这不是套娃,套用允许我们将函数与传递给它的参数相结合产生一个新的函数,下面代码中定义一个add()函数,该函数能够返回一个新的函数,并把参数值传递给这个新函数,从而实现连加操作。

var add = function(){
    var sum = 0;
    for(var i=0; i
        sum += arguments[i];
    }
    return sum;
};
// 添加方法到Function的原型链上
Function.prototype.method = function(name, func){
    this.prototype[name] = func;
    return this;
};
// 套用方法
Function.method('curry', function(){
    // 通过数组Array的slice方法,使得arguments也具有concat方法
    var slice = Array.prototype.slice,
        args = slice.apply(arguments), that = this;
    return function(){
        return that.apply(null, args.concat(slice.apply(arguments)));
    };
});
alert(add.curry(1,2)(3,4)); // 10

14、记忆 

函数可以用对象去记住先前操作的结果,从而能避免无谓的运算。这种优化被称为记忆。

以上仅代表个人学习所得,必定会有不全面之处,还望读者多多指正。

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值