首页 > 网站 > WEB开发 > 正文

JavaScript Nested Function 的时空和身份属性

2024-04-27 14:20:05
字体:
来源:转载
供稿:网友

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


上一篇:$filter

下一篇:JavaScript中的重载解读

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表