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 的时空和身份属性

时间: 2024-10-25 20:59:15

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

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

注:这篇文章原文:http://www.jb51.net/article/30883.htm 自己作为学习,重新写写. 一.写在前面的话 前端javascript编程还只是略懂皮毛,DOM知道一点,jquey会用一点点,深知夯实基础,了解前端的系统的知识对于web开发(自己主要做的是PHP后台的开发)的重要.固然,要用什么,就查什么(现学现卖)很合理,但对于长远来讲,只是在隔靴捎痒,很难有实际的作为. 故,痛定思痛,应该对web前端,尤其是 javascript开发(过程式-->面向对象-->

javascript的Function 和其 Arguments

http://shengren-wang.iteye.com/blog/1343256 javascript的Function属性:1.Arguments对象2.caller 对调用单前函数的Function的引用,如果是顶层代码调用, 则返回null(firefox返回undefined). 注:只有在代码执行时才有意义3.length 声明函数是指定的命名参数的个数(函数定义是,定义参数的个数)4.prototype 一个对象,用于构造函数,这个对象定义的属性和方法 由构造函数创建的所有对象

JavaScript获取Function的名字

如何获取JavaScript中Function的名字是一个很基本的问题.可以通过将function转化成字符串,用substring取它的名字,或者使用ECMAScript 6中的Function.name的支持.此属性只有在IE下有可能不兼容.详见MDN. 关于从字符串中获得其名字的方法如下 (转自stackoverflow): function functionName(fun) { var ret = fun.toString(); ret = ret.substr('function '

javaScript之function定义

背景知识 函数定义 在javaScript中,function的定义有3种: 1.匿名定义                function(){} 2.非匿名定义                function fn(){}                fn = new Function(); 触发函数执行 对于匿名函数:                        (function(){})();       //执行一个匿名函数                        var f

javascript Arguments对象之length、callee属性

1.length属性,我们可以利用Arguments对象的length属性来获取实际传递进的参数有几个. function a(x, y, z) { //arguments.callee指向函数a(),arguments.callee.length==a.length; alert(arguments.callee.length); //输出5 alert(arguments.length); if (arguments.callee.length != arguments.length) {

javascript获取对象直接量中的属性和属性值

javascript获取对象直接量中的属性和属性值:所谓的对象直接量简单来说就是,由大括号包裹的键值对列表,例如: var antzone={ webName:"蚂蚁部落", address:"青岛市南区", age:2 } 下面介绍一下如何获取对象直接量中的属性和属性值,代码如下: var antzone={ webName:"蚂蚁部落", address:"青岛市南区", age:2 } for(var prop in a

Javascript使用function创建类的两种方法

1.使用function类 //myFunction.js var CMyFunc=function() { //类的公共方法,供外部调用 this.Func1=function() { var i=0; return i; } this.Func2=function() { _privateFunc(); } //类中的私有方法,供公共方法调用 function _privateFunc() { return 0; ] } CMyFunc myFunc=new CMyFunc(); 使用:其它

javascript错误:对象不支持此属性或方法

javascript错误:对象不支持此属性或方法 出现如上错误的原因主要有以下两种: 1.方法对应的JS函数未定义 2.属性所用的id名字跟函数名相同也会报此错误,id或函数名改个地方即可.

[javascript svg fill stroke stroke-width points polyline 属性讲解] svg fill stroke stroke-width points polyline 绘制折线属性讲解

1 <!DOCTYPE html> 2 <html lang='zh-cn'> 3 <head> 4 <title>Insert you title</title> 5 <meta name='description' content='this is my page'> 6 <meta name='keywords' content='keyword1,keyword2,keyword3'> 7 <meta htt