javascript 模拟函数指针(2)
来源:uedmagazine 发布时间:2009-09-19 18:02:00
然而这种代码对runtime的上下文过于依赖,也就是说程序员必须给定当时fun1和fun2所在的命名空间,这样增大了程序的耦合度,也不利于维护。如果我们将changefun一同抽象进类定义中呢?即,我们希望在类定义之初就能交换fun1和fun2,对于一个还没有实例化的类中,情况将更加复杂,这时即便是fun1和fun2和changefun在同一个命名空间中,程序也无法按正确执行,比如:
var changefun = function(s1,s2){
eval('var _o = '+s1+';'+s1+' = '+s2+';'+s2+' = _o;');
};
var myClass1 = function(){
var fun1 = function(str){
alert('执行函数1,参数:'+str);
};
var fun2 = function(str){
alert('执行函数2,参数'+str);
};
changefun('fun2','fun1');
return {
init:function(){
changefun('fun2','fun1');
},
fun1:fun1,
fun2:fun2
};
};
var a = new myClass1();
a.fun1('1');
a.fun2('2');
我们可以换个思路来看,与其让交换操作在changefun中执行,不如在类的命名空间中执行,我们重写changefun成:
var changefun = function(s1,s2){
return 'var _o = '+s1+';'+s1+' = '+s2+';'+s2+' = _o;';
};
让changefun返回一段可执行的代码,在命名空间中被执行,如此可以完成函数交换:
var changefun = function(s1,s2){
return 'var _o = '+s1+';'+s1+' = '+s2+';'+s2+' = _o;';
};
var myClass2 = function(){
var fun1 = function(str){
alert('执行函数1,参数:'+str);
};
var fun2 = function(str){
alert('执行函数2,参数'+str);
};
eval(changefun('fun1','fun2'));
return {
fun1:fun1,
fun2:fun2
};
};
var a = new myClass2();
a.fun1('1');
a.fun2('2');
这样changefun操作被包含在类的逻辑中,在类构造实例的时候即可执行,那我想适时调用闭包中changefun,可以使用
var changefun = function(s1,s2){
return 'var _o = '+s1+';'+s1+' = '+s2+';'+s2+' = _o;';
};
var myClass2 = function(){
var fun1 = function(str){
alert('执行函数1,参数:'+str);
};
var fun2 = function(str){
alert('执行函数2,参数'+str);
};
return {
init:function(){
eval(changefun('this.fun1','this.fun2'));
},
fun1:fun1,
fun2:fun2
};
};
var a = new myClass2();
a.init();
a.fun1('1');
a.fun2('2');
这样的js代码就成功的剥离出三层来,基础代码,类代码和实例运行时代码,可以完成类似函数指针的功能而不受命名空间的影响.


猜你喜欢
- 对于初学者,入门至关重要,这关系到初学者是从入门到精通还是从入门到放弃。以下是结合Python的学习经验,整理出的一条学习路径,主要有四个阶
- 一、题目1.主题:逻辑回归2.描述:假设你是某大学招生主管,你想根据两次考试的结果决定每个申请者的录取机会。现有以往申请者的历史数据,可以此
- 图像可能在生成、传输或者采集过程中夹带了噪声,去噪声是图像处理中常用的手法。通常去噪声用滤波的方法,比如中值滤波、均值滤波。但是那样的算法不
- 对于软件来说,每一个新版本的推出都应该是一种进步,不可否认,阿里旺旺2008版相较于之前的版本的确是有很多的进步,但进步的同时却也有着比之前
- MySQL 在处理 GROUP BY 和 DISTINCT 查询的方式在大多数情况下类似,事实上,在优化过程中有时候会把在这两种方式中转换。
- 最近和一程序员合作项目。弄的我头都大了~埋怨我的CSS命名看不懂~得按照他的来。结果我打开他的页面,看了看,从头第一个开始就是content
- pop()方法从列表移除并返回最后一个对象或obj。语法以下是pop()方法的语法:list.pop(obj=list[-1])
- 利用Python将多份excel表格整理成一份表格,抛弃过去逐份打开复制粘贴的方式。直接附上代码:import xlrd import xl
- 前言我们先说一下思路:先对目标网站发送请求,获取html源码,然后对源码里面的所以图片链接进行筛选,然后再次对图片链接发送请求,然后保存。思
- 例如:性别 gender 男 女 保密基本语法:enum(数据值 1,数据值 2...);数据值列表在 255 个以内,使用 1 个字节来存
- 地图这期文章我们一起来看看地图是如何绘制的,如何在地图里面添加数据进行多维度的展示,下面我们一起来感受一下地图的魅力吧!&ldquo
- 本文实例讲述了javascript实现多栏闭合展开式广告位菜单效果。分享给大家供大家参考。具体如下:从操作方式上来说,有似曾相识的感觉,有点
- 随着传统的数据库、计算机网络和数字通信技术的飞速发展,以数据分布存储和分布处理为主要特征的分布式数据库系统的研究和开发越来越受到人们的关注。
- 目录本文目标如何使用本教程正则表达式到底是什么?入门测试正则表达式元字符字符转义重复字符类反义替换分组后向引用零宽断言负向零宽断言注释贪婪与
- Character 字符串:数据类型描述存储char(n)固定长度的字符串。最多 8,000 个字符。nvarchar(n)可变长度的字符串
- 我们对 DataFrame 进行选择,大抵从这三个层次考虑:行列、区域、单元格。其对应使用的方法如下:一. 行,列 --> df[]二
- 如下代码可以计算输入的两张图像的结构相似度(SSIM),结果与matlab计算结果一致// An highlighted blockimpo
- 几天前,浏览器家族有刚诞生了一位小王子,就是Google推出的Chrome浏览器。由于Chrome出生名门,尽管他还是个小家伙,没有人敢小看
- import cv2import numpy as npimport matplotlib.pyplot as plt# Grayscale
- 由于javascript无法获取img文件头数据,必须等待其加载完毕后才能获取真实的大小,所以lightbox类效果为了让图片居中显示,导致