ECMAScript02.JavaScript 面向对象精要–函数

在JavaScript中,函数其实呢是目标。是函数不同为任何对象的特色是:
函数存在一个为称之为[[Call]]的内属性。[[Call]]性是函数独有的,
标明该目标足以让实践。ECMAScript 定义了typeof操作符对具有[[Call]]
特性的靶子回来 “function”。理解函数的一言一行是明白JavaScript的中坚。

一.函累声明式和表达式
 1.1 函数声明
  因function开头后面就函数的名

  function add(num1,num2){
       return num1 + num2;
  }

  JavaScript中能够针对函数声明进行升级,这是因引擎提前领略了函数的
  名字。而函数表达式仅会经过变量引用,因此无法晋升。

 1.2 函数表达式
  function开头后面不需丰富函数称,这种函数称为匿名函数,而是给
  一个变量引用。
  

var add = function(num1, num2){
       return num1 + num2;
  };

 1.3 函数声明和表达区别
 

 add(5,5);//返回10
  add2(10,10)//错误:add2 is not a function
  function add(num1,num2){
       return num1 + num2;
  }
  var add2 = function(num1,num2){
       return num1 + num2;
  };
  add2(5,5)//返回10;

 

 二.函数即便是价值
  函数是JavaScript的均等不行重要,你可以像对象同使用函数。
  也可以拿其赋给变量,在目标被加上它们,将它们当成参数传递给
  别的函数,或打别的函数中归。基本上只要时时方可采取另外引用值
  的地方,就可应用函数。
  

 1 function sayHi(){
 2    console.log("Hi!");
 3   }
 4   sayHi();//输出 "Hi!"
 5   var sayHi2 = sayHi;
 6   sayHi2();//输出 "Hi!"
 7   //使用构造函数实现:
 8   var sayHi = new Function("console.log(\"Hi!\");");
 9   sayHi();// "Hi!"
10   var sayHi2 = sayHi;
11   sayHi2();// "Hi!"
12   //把函数当成参数传递
13   var numbers = [1,5,8,4,7,10,2,6];
14   numbers.sort(function(first,second){
15        return first - second;
16   })
17   console.log(numbers); //"[1,2,4,5,6,7,8,10]"
18   numbers.sort();
19   console.log(numbers);// "[1,10,2,3,4,5,7,8]"

 

 三.函数参数
  JavaScript函数的其他一个特殊之处当吃你得于函数传递
  任意数量之参数却休招错误。那是因函数参数实际上给保存在
  一个 类数组arguments的对象吃。arguments的length属性会告知
  你手上时有发生微个价。Array.isArray(arguments)永远回false。
  函数也是目标,所以啊闹总体性,lenght属性返回函数 期望参数
  个数。

  3.1 arguments对象
  

 1  function reflect(val){
 2     return val;
 3    }
 4    console.log(reflect("Hi!")); // "Hi!"
 5    console.log(reflect("Hi!",25)); // "Hi!"
 6    console.log(reflect.length); // "1"
 7 
 8    reflect = function(){
 9     return arguments[0];
10    }
11    console.log(reflect("Hi!")); // "Hi!"
12    console.log(reflect("Hi!",25)); // "Hi!"
13    console.log(reflect.length); // "0"

 

  3.2 重载
   JavaScript没有重载,但可效仿重载。
   以传入的参数独数arguments.length来判断执行函数体。
   

function sayHi(msg){
    if(argrments.length === 0){
     msg = "default msg";
    }else{
     console.log(msg);
    }
}
   sayHi('hello');// 输出 "hello"

 

 四.对象方法
  如果一个靶的特性是函数,则该函数被名方法。
  

var person = {
   name : 'Nicholas',
   sayNmae : function(){
    console.log(person.name);
   }
}

 

  4.1 this对熊
   JavaScript 所有函数作用域内都发出一个this对象表示调用
   该函数的靶子。在全局作用域中this代表全局对象(window).
   当一个函数作为目标的法子为调用时,默认this的值等于那个
   对象。
   

function say(){
    console.log(this.name);
}
   var person1 = {
    name : 'Nicholas',
    sayNmae : say
   }
   var person2 = {
    name : 'Greg',
    syaName : say
   }
   person1.sayName(); // "Nicholas"
   person2.sayName(); // "Greg"

 

  4.2 改变this (call(),apply(),bind())
   有3种函数方法允许而转移this的值。记住:函数也是目标
   所以函数也生措施。

   4.2.1 call(this的值,’参数1′,’参数2′)方法 
    

    function say(label){
         console.log(label + ":"+this.name);
    }
    var person1 = {
     name : 'Nicholas'
    };
    var person2 = {
     name : 'Greg'
    };
    var name = 'Micheel';
    say.call(this,'global'); //输出 "global:Micheel"
    say.call(person1,'person1');//输出 "person1 : Micholas"
    say.call(person2,'person2');//输出 "person12 : Greg"

 

   4.2.2 apply(this的值,[‘参数1′,’参数2’])方法
    

    say.apply(this,['global']); //输出 "global:Micheel"
    say.apply(person1,['person1']);//输出 "person1 : Micholas"
    say.apply(person2,['person2']);//输出 "person12 : Greg"

 

   4.2.3 bind()方法
    

    var say1 = say.bind(person1);
    say1("person1"); //输出 "person1 : Micholas"
    var say2 = say.bind(person2,"person2");
    say2(); // 输出 "person12 : Greg"