zoukankan      html  css  js  c++  java
  • JavaScript Nested Function 的时空和身份属性

    JavaScript 的function 不仅仅是一等公民,简直就是特殊公民。它有许多独特的特征:

    1) 它是object,可以存储,传递,附加属性。

    2) 它可以有lexical closure, 是事件处理,和OOP encapsulation 的方便工具。

    3) 它可以匿名,然后通过变量名或者依附于一个object 的 property来被调用

    4) 它有多种“被定义”方式:可以通过function statement, function expression, new, Function object 等。

    5) 特可以被“绑定”(通过bind 或 apply)到不同的object,有不同的 this 指针。

    JavaScript function 的上述灵活性和动态性,使得它比多数以functional programming language 著称的语言都更functional,而且更动态,更强大。

    但是有时候用它的一些属性时,却不免陷入微妙的性能或功能问题。此文就举一个小例子:

    JavaScript nested function ,这个属性是,你可以把一个function 的定义当作一个母函数(或外函数)的语句(statement),最好以例子说明:

    function outerfunc (y) {

                   var internal1 = 100 ; 

                   // (nested) Function statements:

                   // innerfunc is in inner scope and can capture all outer variables

                   function innerfunc(x) {

                       internal1 = internal1 + x;

                       return internal4 + x;

                   } 

                   Innerfunc(y);

                   console.log(‘internal1 is’:  internal1);

                   return innerfunc;

    }

    var ifun = outerfunc (1);

    ifun(2);

    var ifun2 = outerfunc (3);

    if (ifun === ifun2)

          console.log('ifun is equal to ifun2' );          // Line1

    else

            console.log('ifun is not equal to ifun2' );  //  Line2 

    innerfunc(2); // 出错:innerfunc 无定义

    以上例子中,Innerfunc被定义在outerfunc中,定义 Innerfunc 成了的“可执行命令”,Innerfunc称为“nested  function statement”。  它有两个特征值得注意:

    • nested  function statement 是在运行外围函数(outer  function)动态定义,产生的。

    也就是说它不但在scop上限制与外围函数,在创建时间上也限制与外围函数运行时,这是 nested  function的“时空属性“。

    • nested  function 和 auto 变量类似,outer  function 每次call 时,都会产生一个新的函数。

    这是nested  function的身份属性

    知道第一点很有用,这个可以有许多用例,知道第二点,你就可以猜到上面程序的的末尾是执行Line1还是Line2吧?

    答案是Line2,也就是每次调用outerfunc都会产生一个全新的Innerfunc,这是注重性能的那些程序员们需要了解的。

    2014-8-20 西雅图

  • 相关阅读:
    python---RabbitMQ
    Apicloud学习第四天
    Apicloud学习第三天——获取云数据库的数据方法
    APICloud学习第二天——操作云数据库
    font-spider问题【已解决】
    Apicloud学习第一天
    sass补充(2019-3-9)
    sublime中编译的sass如何改变css输出风格?【这里有答案】
    SEO总结
    Sass学习第一天
  • 原文地址:https://www.cnblogs.com/ly8838/p/3924642.html
Copyright © 2011-2022 走看看