1、“对外部(局部)变量的访问”是C语言函数指针的最大弱点 。
#include <stdio.h> #include <stdlib.h> /* 结构体定义 */ struct node { struct node *next; int val; }; /* 函数指针类型 */ typedef void (*func_t)(int); /* 循环用函数 */ void foreach(struct node *list,func_t func) { while(list) { func(list->val); list=list->next; } } /* 循环主体函数 */ void f(int n) { printf("node(?)=%d ",n); } /* main函数 */ void main() { // struct node *list =0,*l; struct node *list,*l; int i; /* 准备开始 */ /* 创建链表 */ for(i=0; i<4; i++) { l=malloc(sizeof(struct node)); l->val = i; l->next=i; list=l; } /* 例题主体 */ i=0; l=list; /* while循环 */ while(l) { printf("node(%d) = %d ",i++,l->val); l=l->next; } /* foreach循环 */ foreach(list,f); }
(上边代码有问题)
2、我们已经了解了C语言提供的函数指针的缺点,于是,为了克服这些缺点而出现的功能,就是本次的主题----闭包。
function foreach(list, func) { while (list) { func(list.val); list = list.next; } } var list = null; for (var i = 0; i < 4; i++) { list = { var: i, next: list }; } var i = 0; foreach(list, function(n) { console.log("node(" + i + ") - " + n); i++ });
上边代码有问题
function extent() { var n = 0; return function() { n++; console.log("n=" + n); } } f = extent(); f(); f(); f();
闭包2个术语:
作用域scope 变量的有效范围,摸个变量可以被访问的范围
生命周期extent 变量的寿命,一个变量可以在多长的周期范围内存在并被能够访问
extent()执行后会返回函数对象,我们将其赋值给一个变量。这个函数变量在每次被执行时,局部变量就会被更新,从而输出逐次累加的结果。
局部变量
page 88
《代码的未来》