zoukankan      html  css  js  c++  java
  • JavaScript基础知识整理(引用类型-Function)

    Function

    Function类型实际上是对象,每个函数都是Function类型的实例,自然也就具有属性和方法。


    定义函数通常有三种方式

    使用函数声明

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

    使用函数表达式

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

    使用Function构造函数(因为解析代码次数会增加,所以不推荐用这种方式)

    var sum = new Function("num1","num2","return num1 + num2");//最后一个参数作为函数体,其余参数为创建函数的参数

    函数声明方式声明的函数会先被解析器读取,在其他代码执行前,这种函数已经处于能被访问的状态了


     函数名实际上是指向函数对象的指针,所以函数名和函数并没有互相绑定,多个函数名可以指向同一个函数,在其他oo语言中会有函数重载,ECMAScript中并没有,因为当出现具有相同名称而内容不同的函数时,函数名指向了最新的函数,也就不存在同时表示多个函数体的情况了。

    var sum = function(num1,num2){
         return num1 + num2;
    }
    alert(sum(5,5));//10
    var anotherSum = sum;
    alert(anotherSum(5,5));//10
    sum = null;
    alert(anotherSum(5,5));//10
    var add = function(num){
          return num + 100;  
    };    
    var add = function(num){
          return num + 200;     
    };
    var result = add(100);//300

    函数作为变量可以作为参数传递给另一个函数,也可以通过函数返回一个函数

    function callSomeFunction(someFunction,someArgument){
            return someFunction(someArgument);
    }
    function add(num){
            return num + 10;
    }    
    var result = callSomeFunction(add,10);//20

    函数内部有三个特殊对象,arguments,this,caller.arguments作为一个与数组类似的对象,保存着传给函数的参数,并且拥有一个callee属性,指向函数本身。

    这个callee属性可以解除函数名与函数体的耦合。(通常在函数调用本身时发挥作用)

    function factorial(num){
           if(num <= 1){
                  return 1;
           }else{
                  return num * arguments.callee(num - 1); //不仅仅把函数名局限于factorial
           }
    }                    
    var newFactorial = factorial;
    factorial = new function(){
            return 0;
    }
    alert(newFactorial(5));//120
    alert(factorial(5));//0

    this对象引用的是函数的运行环境对象

    window.color = "red";
    var o = {color : "green"};
    function sayColor(){
          alert(this.color);  
    }    
    o.sayColor = sayColor();
    sayColor();//"red"
    o.sayColor();//"green"

     caller属性保存着调用当前函数的函数的引用,也就是上一级函数的引用。


    函数拥有两个非继承属性和三个非继承方法分别是length,prototype,apply(),call()和bind().

    length表示函数希望接收的命名参数的个数,prototype是一个指向函数原型的指针,这在模拟继承上有很大的作用。

    apply()和call()可以让函数作用在某个特定的作用域,这样可以扩充函数能够运行的作用域。

    apply()接收两个参数,第一个参数是指定函数在哪个作用域中调用,第二个参数是参数数组(可以是Array的实例也可以是arguments对象)。

    function sum(num1,num2){
           return num1 + num2;
    }
    function callSum1(num1,num2){
           return sum.apply(this,arguments);      
    }
    function callSum2(num1,num2){
           return sum.apply(this,[num1,num2]);      
    }
    alert(callSum1(5,5));//10
    alert(callSum2(5,5));//10

    call()与apply()基本相同,不同之处在于接收参数的方式,call()接收参数时,必须把参数逐个列举出来,老老实实一个对应一个。

    function sum(num1,num2){
           return num1 + num2;
    }
    function callSum(num1,num2){
           return sum.call(this,num1,num2);      
    }
    alert(callSum(5,5));//10

    bind()可以创建一个函数实例,这个实例改变了其函数的this,让其this指向传给bind()的参数

    window.color = "red";
    var obj = {color : "green"};
    function sayColor(){
          alert(this.color);  
    }
    var objSayColor = sayColor.bind(obj);
    objSayColor();//"green"
  • 相关阅读:
    自定义指令directive
    angular中的表单验证
    ng-init,ng-controller,ng-model
    Redis执行lua脚本,key不存在的返回值
    消息队列对比
    数据库设计范式
    网络IO模型
    .NET 线程、线程池
    异步和多线程
    Memcache知识点
  • 原文地址:https://www.cnblogs.com/xianglan666/p/12968871.html
Copyright © 2011-2022 走看看