“对外部(局部)变量的访问”是C语言函数指针的最大弱点

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",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\n",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

《代码的未来》

 

posted @ 2019-03-08 11:53  papering  阅读(554)  评论(0编辑  收藏  举报