zoukankan      html  css  js  c++  java
  • Javascirpt详解之函数function

    1.function是什么?

    定义1:函数是有事件驱动的或者当它被调用时执行的可重复使用的代码块。

    定义2:函数定义指的是在javascript引擎内部创建一个函数对象的过程,如果是全局函数的话,这个函数对象会作为属性添加到全局对象上,如果是内部函数(嵌套函数)的话,该函数对象会作为属性添加到上层函数的活动对象上,属性名就是函数名。

    2.使用function  

    2.1 定义

    function f1(){return 'f1';}
    function f1(args){ return 'f1';}

    在javascript中的这两个function被认为是同一个,运行时后面的会覆盖前面的同名函数,另外,function的参数是可选参数,更多时候声明是为了引用方便和可读性。

    function f2(arg1,arg2,arg3)
    {
           return 'f2';
    }
    //调用f2
    f2();
    
    //调用f2
    f2('xiaom','China');
    
    //调用f2
    f2('xiaom','China','boy');

    以上三种调用方法都正确。

    2.2 创建函数实例

    //定义式,定义一个function,该function的名字是f3,相当于一个名为f3的变量指向该function。
     function f3(a,b)
    {
        return a+b;
    }
     
    //声明式,即通过创建"匿名函数"直接赋值给变量,以该变量作为调用时的函数名称
     
    var f3=function(a,b)
    {
       return a+b;
    }
    
    //构造函数式 不常用
    var f3=new Function(‘a’,‘b’,‘return a+b’);
    
    

    定义式创建函数实例后面函数会覆盖前面的同名函数,而声明式则不会。这种差别主要是javascripts解释引擎的工作机制所导致,Javascirpts解释引擎在执行任何函数调用前,首先会在全局作用域中注册以定义式创建函数,然后再依次执行函数调用。因此后定义的函数重写了先面定义的同名函数。相反,对于声明式创建函数,Javascript解释引擎会像对待任何声明的变量一样,等到执行调用该变量的代码时才会对变量求值(该函数才被执行),function is complied, but not executed until you cal it. 

    通过构造函数式而已清楚的看到函数对象的本质,在javascript解释器内部,会自动构造一个Function对象,将函数作为一个内部对象来存储和运行。从示例代码可以看到,一个函数对象和一个普通变量具有同样的规范。

    var myFunction = new Function('a', 'b', 'return a+b');
    console.log(myFunction(3, 4)); // 执行结果7

    构造函数形式创建函数不常用,因为一个函数体通常会有多条语句,如果将它们以字符串形式作为参数传递,代码的可读性差。

    2.3 function当作对象

    ECMAScript的函数实际上是功能完整的对象2。在javascript中函数本身也是一个对象,它的类型是Function,因此它可以有自己的属性和方法,在2.2构造函数式创建函数实例也体验了这一点。

    function upperCaseOf(arg)
    {
        return arg.toUpperCase();
    }

     2.3.1 function作为对象对属性(或者变量)进行赋值

    var city=city ||{};//?
    city.upperCase=upperCaseOf; //注:此处对city.upperCase属性进行赋值时,后来的upperCaseOf不能加括号,其实这里也可以理解为“对象借用其他对象的方法”。
    city.upperCase('zheng zhou'); //return ZHENG ZHOU

    例如,需要在页面载入时进行一些初始化工作,可以先定义一个init函数,在通过window.onload=init;将其绑定到页面载入完成事件,这里的init函数就是作为对象对window.onload属性进行赋值,即加入window的onload事件列表。

     2.3.2 将函数作为参数传值

    函数可以作为对象进行赋值给一个变量或属性,再通过这个变量名进行函数调用,同样可以把函数对象作为参数传递给另一个函数。

    var getBiggerValue = function getBiggerValue(a, b, compareValue)
             {
                 if (compareValue(a, b) > 0) {
                     return a;
                 }
                 else {
                     return b;
                 }
             }
    var result = getBiggerValue(12, 3, function (a, b) { return a-b});
    
    console.log(result);//输出结果是12

     2.3.3 使用function的属性

     在function中用this(或者函数名)引用当前对象,通过对属性的赋值来声明属性。

    function f4()
             {
                 this.id = 1;
                 this.name = 'propertyFunction';
                 f4.counter++; //计算函数调用次数
                 this.getName = function () {
                     return this.name;
                 }
             }
             f4.counter = 0;
             f4();
             console.log(new f4().name); //propertyFunction
             console.log(f4.counter); //2
             f4();
             console.log(f4.counter); //3

    本文参阅以下文章整理得出,仅为个人学习记录笔记,如有侵权,请告知。

    Javascript中的函数对象 http://jeff.familyyu.net/2012/07/06/functional-javascript/

    Javascript创建类/对象的几种方式 http://www.cnblogs.com/lucas/archive/2009/03/17/1411656.html 

    Javascript定义类 http://www.cnblogs.com/lidabo/archive/2011/12/17/2291238.html

    你了解javascript中的function吗? http://www.cnblogs.com/yangdong/archive/2012/02/05/function-in-javascript-0.html

  • 相关阅读:
    剑指OFFER----面试题60. n个骰子的点数
    剑指OFFER----面试题59
    剑指OFFER----面试题59
    剑指OFFER----面试题58
    10.装饰器
    优秀.NET界面控件DevExpress v19.1.6全新来袭!新改进抢“鲜”看
    VS开发框架DevExtreme v19.1全解析!Windows资源管理器UX值得拥有
    Kendo UI for jQuery使用教程:方法和事件
    MyEclipse使用教程:导航代码(一)
    DevExpress ASP.NET Bootstrap v19.1版本亮点:Scheduler控件
  • 原文地址:https://www.cnblogs.com/technote/p/3217566.html
Copyright © 2011-2022 走看看