JavaScript根据函数名字符串调用函数的方法

最近遇到一个问题,JavaScript如何通过函数名的字符串来调用这个函数,到stackoverflow上逛了圈,收获良多,这里总结下:

如果你是要直接调用全局的函数,可以用如下方式:

//定义一个名为foo的函数
function foo() 
{
    alert(1);
}
//第一种调用方式
window['foo']();
//第二种调用方式
eval('foo()');

如果你想要在一个对象里面调用对象自己的属性函数,可以用如下方式:

var test = {
	foo : function(a) {
		alert(a);
	},
	bar : function() {
		var property = 'foo';
		var parameter = ['this is a test!'];
		var fn = this[property];
		if(typeof fn === 'function') {
			fn.apply(this, parameter);
		}
	}
};
test.bar();

上面这段代码是我写的一个小例子,其中的

fn.apply(this, parameter);

有几个好处,第一点就是可以让你调用的foo这个属性函数能够使用到当前的this,如果不用apply是无法调用到当前的this的。第二点就是传递参数变得很自由,如果属性函数需要传入多个参数可以用数组传入。

上面这段小代码就是我在“基于Requirejs和Backbonejs,将Zend Framework 2官方Demo改为RESTful架构的应用”里面做到自动路由分发的核心代码。

在网页中调用C++接口

    最近在公司做一个关于在网页中调用C++接口的项目,现在项目已经做完。在这期间花了一段时间去学了关于这方面的知识,和大家一起分享下。

    首先是在windows客户端中网页的生成,在这期间需要用到IWebBrowser2接口。早期, IWebBrowser2 继承自 IWebBrowser 和 IWebBrowserApp, 还提供不包含在着两个接口中的功能. 所以你应当使用 IWebBrowser2 接口替代 来操纵WebBrowser 控件或者 Internet Explorer.该块知识用到了windows的COM 技术,具体可查看MSDN。IWebBrowser2 接口有4个方法和8个属性,其中最终要的方法就是Navigate2,Navigate2的功能基于Navigate 方法,不同在于 Navigate2 允许你导航到飞URL表达的地方,例如Windows shell folder. (Windows shell folder 是指向标示符指针, 或者windows shell命名空间中的 PIDL,)。该方法最终的参数是第一个,本地HTML文件所在的位置。

   在调用方法后,你就可以看到你自己写的WEB页面了。下面的代码是我的测试页面:

<html>
<script>
function onBtn1(obj)
{
    var aaaa    = external.closeApp();
}
</script>
<body>
<input type="button" name="btn1" value="btn1" onClick="onBtn1(this)" />
</body>
</html>
WEB页面上只有一个Button,点下按钮调用C++里面的closeApp()函数。
那在客户端中CloseApp这个函数如何写?下面会有详细的说明:

1.首先在头文件中声明函数:

void_closeApp();

2.在CPP文件中写函数的具体实现。

3.对函数进行DISP_FUNCTION。代码如下:

DISP_FUNCTION(CHxBrowser, "closeWindow", _closeWindow, VT_NULL, VTS_NONE);

DISP_FUNCTION参数:

theClass 类的名字。

pszName 函数的外部名字。

pfnMember 成员函数的名字。

vtRetVal 指定了函数返回类型的值。

vtsParams 指定了函数参数表的一个或多个常量的用空格分隔的列表。

说明:

DISP_FUNCTION宏被在调度映射中使用,用来定义一个OLE自动化函数。

vtRetVal参数属于VARTYPE类型。这个参数的可能取值来自VARENUM枚举,如下:

符号 返回类型

VT_EMPTY void

VT_I2 short

VT_I4 long

VT_R4 float

VT_R8 double

VT_CY CY

VT_DATE DATE

VT_BSTR BSTR

VT_DISPATCH LPDISPATCH

VT_ERROR SCODE

VT_BOOL BOOL

VT_VARIANT VARIANT

VT_UNKNOWN LPUNKNOWN

 

vtsParams参数是VTS_ 常量中取值的用空格分隔的列表。有空格分隔的一个或多个取值的列表指定了函数的参数列表。例如:

VTS_I2 VTS_PI2

指定了包含一个短整数以及后面的短整数指针的列表。

VTS_ 常量及其含义如下:

符号 参数类型

VTS_I2 short

VTS_I4 long

VTS_R4 float

VTS_R8 double

VTS_CY Const CY or CY*

VTS_DATE DATE

VTS_BSTR LPCSTR

VTS_DISPATCH LPDISPATCH

VTS_SCODE SCODE

VTS_BOOL BOOL

VTS_VARIANT Const VARIANT* or VARIANT&

VTS_UNKNOWN LPUNKNOWN

VTS_PI2 short*

VTS_PI4 long*

VTS_PR4 float*

VTS_PR8 double*

VTS_PCY CY*

VTS_PDATE DATE*

VTS_PBSTR BSTR*

VTS_PDISPATCH LPDISPATCH*

VTS_PSCODE SCODE*

VTS_PBOOL BOOL*

VTS_PVARIANT VARIANT*

VTS_PUNKNOWN LPUNKNOWN*

OK,所有的步骤已经完成,你就可以在你自己写的网页上调用客户端里面的函数对客户端进行操作了!

在CSS样式中调用外部的CSS文件

        今天去面试,面试官问我如何在CSS样式中调用外部的CSS文件。我可是从来没有遇到过这个问题,我说:“没必要这样啊,你只要在页面文件中引入另一个CSS文件就行了啊。”不过,我真的不知道。我回来查阅了资料,发现使用:

@import url(slider.css);

这句话,写在原来的CSS中,就可以引入外部的CSS文件了。这个效果我个人感觉其实跟是一样的。网上很多的人也说这个import有弊端,例如:

1.加载的时候,link是在加载页面前把css加载完毕,而@import url则是读取完文件后在加载,所以会出现一开始没有css样式,闪烁一下出现样式后的页面(网速慢的情况下)。

2.当使用javascript控制dom去改变样式的时候,只能使用link标签,因为@import不是dom可以控制的。

以上两点就足够证明它的弱小了,所以建议不要使用@import url,而使用link,所以面试的时候面试官问的问题都是特别的欠骂啊。

Tonitech版权所有 | 转载请注明出处: http://www.tonitech.com/?p=98