zoukankan      html  css  js  c++  java
  • 《JavaScript高级程序设计》读书笔记(八):Function类及闭包

    Function

    定义

      Function类可以表示开发者定义的任何函数,用Function类直接创建函数的语法如下: 

    var function_name=new Function(agrument1,agrument2,...,argumentN,function_body);

      每个argument都是一个参数,最后一个参数是函数主体(要执行的代码)

      示例:

    function sayHi(sName,sMessage){
    alert("Hello "+sName+","+sMessage);
    }

      还可以如下定义它:

    var sayHi=new Function("sName","sMessage","alert(\"Hello\"+sName+\",\"+sMessage);");

      注:尽管可用Function构造函数创建函数,但最好不要使用它,因为用它定义函数比用传统方式要慢得多。不过,所有函数都应看作是Function类的实例。

    属性和方法

      因为函数是引用类型,所以它们也有属性和方法,ECMAScript定义的属性length声明了函数期望的参数个数,例如: 

    function doAdd(iNum){
    alert(iNum+10);
    }

    function sayHi(){
    alert("Hi");
    }

    alert(doAdd.length);//outpus 1
    alert(sayHi.length);//outpus 0

      Function对象也有与所有对象共享的标准valueOf()方法和toString()方法,这两个方法返回的都是函数的源代码,在调试时尤其有用。

      例如:

    function doAdd(iNum){
    alert(iNum+10);
    }
    alert(doAdd.toString());

      这段代码输出了doAdd()函数的文本。

     

    闭包

    定义

      所谓闭包,是指词法表示包括不必计算的变量的函数,也就是说,该函数能使用函数外定义的变量。在ECMAScript中使用全局变量是一个简单的闭包实例。

      示例:

    var sMessage="Hello World";
    function sayHelloWold(){
    alert(sMessage);
    }
    sayHelloWorld();

      在一个函数中定义另一个函数会使闭包变得更复杂,如:

    var iBaseNum=10;
    function addNumbers(iNum1,iNum2){
    function doAddtion(){
    return iNum1+iNum2+iBaseNum;
    }
    return doAddtion();
    }

      这里函数addNumbers()包括函数doAddtion()(闭包)。内部函数是个闭包,因为它将获取外部函数的参数iNum1iNum2以及全局变量iBaseNum的值。addNumbers()的最后一步调用了内部函数,把两个参数和全局变量相加,并返回它们的和。这里要掌握的重要概念是doAddtion()函数根本不接受参数,它使用的是从执行环境中获取的。

      可以看到,闭包是ECMAScript中非常强大多用的一部分,可以用于执行复杂的计算。就像使用任何高级函数一样,在使用闭包时要当心,因为它们可能会变得非常复杂。

    本文示例代码

    版权

    作者:Artwl

    出处:http://artwl.cnblogs.com

    本文首发博客园,版权归作者跟博客园共有。转载必须保留本段声明,并在页面显著位置给出本文链接,否则保留追究法律责任的权利。

  • 相关阅读:
    Swift _ OC _ 混编
    CoreAnimation 寄宿图
    CoreAnimation 开篇
    iOS 杂笔-26(苹果禁用热更新)
    Swift_TableView(delegate,dataSource,prefetchDataSource 详解)
    Swift_ScrollView _ API详解
    插入排序_c++
    选择排序_c++
    冒泡排序_c++
    Swift_协议
  • 原文地址:https://www.cnblogs.com/artwl/p/2337902.html
Copyright © 2011-2022 走看看