在javaScript 中函数就是对象,对象是'名/值'对的集合拥有一个连到原型对象的隐藏连接。

对象字面量产生的对象连接到 Object.prototype。函数连接到 Function.prototype (该原型对象本身连接到Object.prototype)。

每个函数在创建时会附加2个隐藏属性:函数的上下文实现函数执行的代码(会设置一个调用属性,调用一个函数时,可以理解为:调用此函数的调用属性)。

 

函数字面量

  函数通过函数字面量创建:

var add = function(a,b){
    return a+b;
}

 

函数字面量包含4个部分:

  • 保留字 function
  • 函数名,它可以被省略,函数可以用它的名字递归调用自己,如果没有名字,就称之为匿名函数
  • 在圆括号中的参数,多个参数逗号隔开
  • 包含在花括号中的语句,这些语句是函数的主体。在函数被调用时执行

调用

  调用一个函数会暂停当前函数的执行,传递控制权和参数和新的函数,处了声明定义时的形式参数(形参),每个函数还会收到2个附加参数: this 和 arguments。

  参数 this 在面向对象编程中非常重要,它的值取决于调用模式,在javaScript 中一共有4中调用模式:方法调用模式函数调用模式构造器调用模式apply调用模式

   方法调用模式

    当一个函数被保存在一个对象属性中,我们称之为方法调用,当一个方法调用时,this会绑定到该对象,方法可以使用this访问自己所属的对象,所以能访问或者修改对象上的属性。

  例如 

 

var obj = {
    name: 'zs',
    say: function(){
     this.name = 'ls';
        return this.name;
    }
}
obj.say();//ls 

  函数调用模式

    当一个函数并非一个对象属性时,那么它就是当一个函数调用,此模式下,this 会绑定全局对象。

var num = add(3,4);

  构造器调用模式

    如果一个函数前面带上 new 来调用,那么背地里会连接到该函数的 prototype 成员的新对象,同时this会绑定到新对象上。    

var a = function(){}
a.prototype.getName = function(){
    return 'zs';
}
var b = new a();
b.getName();//zs

  apply调用模式

    apply 方法让我们构建一个参数数组传递给调用函数,也允许我们选择 this 的值。apply 方法接收2个参数,第一个是要绑定给 this 的值,第2个就是一个参数数组。

var arr = [3,4];
function add (a,b){
    return a + b;
}
var sum = add.apply(null,arr);
console.log(sum);//7
function a(){
    return this.name;
}
var t = {
    name: 'zs'
}
var name = a.apply(t);
console.log(name);//zs

 

    

 

posted on 2018-12-17 09:42  浅唱年华1920  阅读(143)  评论(0编辑  收藏  举报