zoukankan      html  css  js  c++  java
  • JavaScript读书笔记(6)-Function

    Function类型

    ECMAScript中函数是对象,每个函数都是Function类型的实例,也有属性和方法,函数是对象,函数名实际上市一个指向函数对象的指针,不会与某个函数绑定;

    function sum(num1,num2){

             return num1+num2;

    }

    同:

    var sum=function(num1,num2){

             return num1+num2;

    };

    (1)没有重载

    若声明了两个同名函数,后面的函数会覆盖前面的函数;

    (2)函数声明和函数表达式

    解析器会率先读取函数声明,并使其在执行任何代码之前可以访问,而函数表达式,必须等到解析器执行到它所在的代码行,才会真正被解释执行;

    alert(sum(10,10));

    function sum(num1,num2){

             return num1+num2;

    }

    以上代码正常执行,解析器在代码执行之前,读取并将函数声明添加到执行环境中,对代码求值时,js引擎在第一遍会声明函数并将它们放到源代码树的顶部;

    以下代码中(函数表达式方法),在执行期间导致错误

    alert(sum(10,10));

    var sum=function(num1,num2){

             return num1+num2;

    }

    函数位于一个初始化语句中,而不是一个函数声明,在执行到函数所在的语句之前,变量sum中不会保存有对函数的引用;

    (3)作为值的函数

    函数本身就是变量,函数可以作为值来使用,不仅可以像传递参数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回;

    function callSomeFunction(somFunction,someArgment){

             return someFunction(someArgment);

    }

    function add10(num){

             return num+10;

    }

    var result=callSomeFunction(add10,10);

    alert(result);   //20

    可以从一个函数中返回另一个函数

    function createComparisonFunction(propertyName){

             return function(object1,object2){

                      var value1=object1[propertyName];

                       var value2=object2[propertyName];

                       if (value1<value2){

                                return -1;

                       }else if(value1>value2){

                                return 1;

    }else {

             return 0;

    }

    };

    }

    (4)函数内部属性

    在函数内部有两个特殊的对象:arguments和this;

    arguments保存函数参数,还有个callee属性,为一个指针,指向拥有这个arguments对象的函数;

    function factorial(num){

             if(num<=1){

                      return 1;

    }else{

             return num*arguments.callee(num-1);

    }

    }

    this引用的是函数据以执行的环境对象;

    ECMAScript5规范了另一个函数对象属性:caller,这个属性中保存着调用当前函数的函数的引用;如果是在全局作用域中调用当前函数,它的值为null;

    当函数在严格模式下运行时,访问arguments.callee会导致错误,argumen.caller也是,在非严格模式下这个属性始终是undefined;

    在严格模式下不能为函数的caller属性赋值,否则会导致错误;

    (5)函数属性和方法

    每个函数都包含两个属性:length和prototype;

    length属性表示函数希望接收的命名参数的个数;

    对于ECMAScript中的引用类型而言,prototype是保存它们所有实例方法的真正所在,prototype属性不可枚举;

    每个函数都包含两个非继承而来的方法:apply和call;在特定的作用域中调用函数,即设置函数体内this对象的值;

    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(10,10)); //20

    alert(callSum2(10,10));  //20

    在严格模式下,为指定环境对象而调用函数,this值不会转型为window;

    call方法,传递给函数的参数必须逐个列举出来

    function sum(num1,num2){

             return num1+num2;

    }

    function callSum(num1,num2){

             return sum.apply(this,num1,num2);

    }

    alert(callSum(10,10)); //20

    apply和call真正强大的地方时能够扩充函数赖以运行的作用域;

    window.color=”red”;

    var o={color:”blue”};

    function sayColor(){

             alert(this.color);

    }

    sayColor();  //red

    sayColor.call(this); //red

    sayColor.call(window);  //red

    sayColor.call(o);  //blue

    ECMAScript5还定义了bind方法,这个方法会创建一个函数实例,其this值会被绑定到传给bind函数的值:

    window.color=”red”;

    var o={color:”blue”};

    function sayColor(){

             alert(this.color);

    }

    var objectSayColor=sayColor.bind(o);

    objectSayColor();  //blue

    每个函数继承的toLocalString和toString方法始终都会返回函数的代码;

  • 相关阅读:
    webkit v8 chromium blink chrome 的关系
    webkit 系列
    工具使用过程中遇到问题
    ElasticSearch实战笔记
    办理北京市居住证需要哪些资料
    办理北京市居住证需要哪些资料
    MongoDB 笔记
    Javascript问题集锦
    sqlserver2016 management tool v18
    PostMan测试Web Service
  • 原文地址:https://www.cnblogs.com/xyl-share-happy/p/4574355.html
Copyright © 2011-2022 走看看