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 西雅图

JavaScript Nested Function 的时空和身份属性的更多相关文章

  1. javascript 之Function对象的apply(),call(),bind(),方法和arguments,caller,length属性

    注:这篇文章原文:http://www.jb51.net/article/30883.htm 自己作为学习,重新写写. 一.写在前面的话 前端javascript编程还只是略懂皮毛,DOM知道一点,j ...

  2. JavaScript笔记 Function

    在JavaScript中方法由两部分组成: 方法名和方法体. JavaScript中的方法跟其他传统面向对象语言不同,它跟普通的变量没有区别,唯一不同点是它是Function对象,因此它会有一些Fun ...

  3. javascript中元素的scrollLeft和scrollTop属性说明

    再说意义之前,前说一下这两个属性的适用范围: 注意:这两个属性只能用于元素设置了overflow的css样式中.否者这两个属性没有任何意义.且overflow的值不能为visible,但可以为hidd ...

  4. javascript的Function 和其 Arguments

    http://shengren-wang.iteye.com/blog/1343256 javascript的Function属性:1.Arguments对象2.caller 对调用单前函数的Func ...

  5. JavaScript之Function函数深入总结

    整理了JavaScript中函数Function的各种,感觉函数就是一大对象啊,各种知识点都能牵扯进来,不单单是 Function 这个本身原生的引用类型的各种用法,还包含执行环境,作用域,闭包,上下 ...

  6. Javascript中Function,Object,Prototypes,__proto__等概念详解

    http://anykoro.sinaapp.com/2012/01/31/javascript%E4%B8%ADfunctionobjectprototypes__proto__%E7%AD%89% ...

  7. javascript 中function(){},new function(),new Function(),Function 摘录

    函数是JavaScript中很重要的一个语言元素,并且提供了一个function关键字和内置对象Function,下面是其可能的用法和它们之间的关系. function使用方式 var foo01 = ...

  8. javaScript之function定义

    背景知识 函数定义 在javaScript中,function的定义有3种: 1.匿名定义                function(){} 2.非匿名定义                fun ...

  9. javascript:与获取鼠标位置有关的属性

    javascript并没有mouse对象,获取鼠标坐标要靠强大的event对象。 我们通过监听document的mousemove,就可以实时获得鼠标位置。 但是!!event中和鼠标相关的属性太多了 ...

随机推荐

  1. Mesh绘制雷达图(UGUI)

    参考资料:http://www.cnblogs.com/jeason1997/p/5130413.html ** 描述:雷达图 刷新 radarDate.SetVerticesDirty(); usi ...

  2. hdu 5100 Chessboard

    http://acm.hdu.edu.cn/showproblem.php?pid=5100 在比赛时没看懂题就没看,结束之后,看了解题报告才知道怎么做. 解题报告: 首先,若n<k,则棋盘连一 ...

  3. poj 3020Antenna Placement

    http://poj.org/problem?id=3020 #include<cstdio> #include<cstring> #include<algorithm& ...

  4. 【转】Java基础笔记 – 枚举类型的使用介绍和静态导入--不错

    原文网址:http://www.itzhai.com/java-based-notes-introduction-and-use-of-an-enumeration-type-static-impor ...

  5. 抽象基类(ABC),纯虚函数

    #ifndef _ACCTABC_H_ #define _ACCTABC_H_ //(* #include <iostream> #include <string> //*) ...

  6. sts 去掉启动的rss功能

    STS(spring tools suite) 每次开启都显示,比较烦人,可以在设置中禁用掉,具体方法:window->Perferences,然后查找dashboard,将启动时展示dashb ...

  7. Hibernate 关于load和get方法区别

    load和个体方法都可以充分利用内部缓存和二级缓存中的现有数据. ******************************************************************* ...

  8. Unity3D NGUI制作的Button放到场景中,按钮从2D变到3D

    通常我们使用Button都是在UI界面,即NGUI的摄像机下,如果想换到场景中,即不让按钮以UI形式显现,而是和场景中的物体一起随着摄像机移动而缩小,放大. 很简单,把Button从NGUi的摄像机中 ...

  9. SKKeyframeSequence类

    继承自 NSObject 符合 NSCodingNSCopyingNSObject 框架  /System/Library/Frameworks/SpriteKit.framework 可用性 可用于 ...

  10. Activity进入与退出的动画

    1.在res建立目录anim放入动画效果xml文件 1.1   进入文件  push_left_in.xml <?xml version="1.0" encoding=&qu ...