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 西雅图
JavaScript Nested Function 的时空和身份属性的更多相关文章
- javascript 之Function对象的apply(),call(),bind(),方法和arguments,caller,length属性
注:这篇文章原文:http://www.jb51.net/article/30883.htm 自己作为学习,重新写写. 一.写在前面的话 前端javascript编程还只是略懂皮毛,DOM知道一点,j ...
- JavaScript笔记 Function
在JavaScript中方法由两部分组成: 方法名和方法体. JavaScript中的方法跟其他传统面向对象语言不同,它跟普通的变量没有区别,唯一不同点是它是Function对象,因此它会有一些Fun ...
- javascript中元素的scrollLeft和scrollTop属性说明
再说意义之前,前说一下这两个属性的适用范围: 注意:这两个属性只能用于元素设置了overflow的css样式中.否者这两个属性没有任何意义.且overflow的值不能为visible,但可以为hidd ...
- javascript的Function 和其 Arguments
http://shengren-wang.iteye.com/blog/1343256 javascript的Function属性:1.Arguments对象2.caller 对调用单前函数的Func ...
- JavaScript之Function函数深入总结
整理了JavaScript中函数Function的各种,感觉函数就是一大对象啊,各种知识点都能牵扯进来,不单单是 Function 这个本身原生的引用类型的各种用法,还包含执行环境,作用域,闭包,上下 ...
- Javascript中Function,Object,Prototypes,__proto__等概念详解
http://anykoro.sinaapp.com/2012/01/31/javascript%E4%B8%ADfunctionobjectprototypes__proto__%E7%AD%89% ...
- javascript 中function(){},new function(),new Function(),Function 摘录
函数是JavaScript中很重要的一个语言元素,并且提供了一个function关键字和内置对象Function,下面是其可能的用法和它们之间的关系. function使用方式 var foo01 = ...
- javaScript之function定义
背景知识 函数定义 在javaScript中,function的定义有3种: 1.匿名定义 function(){} 2.非匿名定义 fun ...
- javascript:与获取鼠标位置有关的属性
javascript并没有mouse对象,获取鼠标坐标要靠强大的event对象。 我们通过监听document的mousemove,就可以实时获得鼠标位置。 但是!!event中和鼠标相关的属性太多了 ...
随机推荐
- 汇编-显示我放到AL中的数值
按书上练习,有一些我看不懂. . .model flat,stdcall option casemap:none include \masmplus\include\windows.inc inclu ...
- Delphi会自动初始化全局变量和类成员变量,但不初始化局部变量
If you don't explicitly initialize a global variable, the compiler initializes it to 0. Object insta ...
- onItemClickListener监听的整个item的点击。如何只监听那个framelayout的点击 onItemClickListener监听的整个item的点击。如何只监听那个framelayout的点击
已经知道了.复写getView()的时候,在内部Viewholder.length.setOnClickListener(匿名内部类) 然后新建一个接口方进去 ,然后外面的listView设置&l ...
- 利用ordered hints优化SQL
SQL_ID 4g70n3k9bqc5v, child number 0 ------------------------------------- MERGE INTO YJBZH_GRXDFHZ ...
- COJ 2024 仙境传奇(五)——一个天才的觉醒 素数筛
整理模板,同时测了一下memset,for,fill到底谁快... 结果:memset最快,其次是for,fill最慢QAQ.... #include<iostream> #include ...
- 【动态规划】XMU 1032 装配线问题
题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1032 题目大意: 一个物品在2条生产线上加工,每条线上n(n<=1000)个节点 ...
- 【翻译】Organizing ASP.NET MVC solutions 如何组织你的ASP.NET MVC解决方案
序言 时隔一年,弦哥重出江湖,对于我们学习.NET MVC那将有大大的好处,期待弦哥的重构系列.在弦哥与jerrychou的交流中提到了一篇文章http://lostechies.com/jimmyb ...
- 乱译文档--开始使用Musca
原文地址:http://aerosuidae.net/musca_start.html aerosuidae.net Musca - Start Using startx Launch it from ...
- mysql oracle静默 一键安装脚本
pre-read; 为了达到一键搞定的目的!现Ruiy简单做如下几小条规定 如果你想这么一键来搞定请君莫要违背约束! 1. 下载 `二进制` mysql软件介质版本不限,二进制包务必,源码及rpm ...
- [置顶] COcos2d-X 中文API
本文来自http://blog.csdn.net/runaying ,引用必须注明出处! COcos2d-X 中文API 温馨提醒:使用二维码扫描软件,就可以在手机上访问我的博客啦!另外大家可以访问另 ...