1.eval(str)-----eval方法效率低,而且不安全
eval(str) 函数可计算某个字符串,并执行其中的的 JavaScript 代码。注意,eval方法的参数只能是字符串,如果传递的不是字符串的话,会直接返回传值,而非调用。由于eval方法效率低,而且不安全,不建议使用。
function test(str){
alert(str);
}
var a='test';
var b='345';
eval(a+'('+123+')');
eval(a+'(b)');
1.全局函数声明和全局变量会变成全局对象的属性。全局对象在进入执行上下文前创建的一个唯一的对象。在浏览器运行环境里,全局对象就是window对象
2.属性访问可以使用 点标记法 或者括号标记法。其中使用点访问需要标识符,二括号访问使用的是标识符对应的字符串
function test(str){
alert(str);
}
var param='哈哈';
window['test'](param);//直接执行
window['test'].call(this,'param');
依赖 underscore.js
代码
//模拟js 通过字符串执行函数
_.mixin({
/**基于字符串获取 函数名称和参数对象 //不准持有无效的引号
* 示例 test(1,5,6,7);
* @params str 字符串函数
*
*/
getFunctionObj: function(str) {
var functionObj = {
functionName: "",
functionParams: []
}
if(_.isString(str)) {
if(str.indexOf("(") != -1 && str.indexOf(")") != -1) {
var arr = str.split("(");
functionObj.functionName = arr[0];
arr = arr[1].split(")");
if(!_.isEmpty(arr[0])) {
functionObj.functionParams = arr[0].split(",");
}
} else { //兼容未命名() 的函数
functionObj.functionName = str;
}
}
return functionObj;
},
/* 基于字符串获取当前window的对象函数对象
* @params str 字符串函数
* @parmas falg 默认false,
* true 立即调用这个函数,false 返回函数对象及其函数参数
*/
getFunction: function(str, falg) {
if(_.isString(str)) {
var functionObj = _.getFunctionObj(str);
var strFunction = functionObj.functionName;
if(!_.isEmpty(strFunction)) {
var arr = strFunction.split(".");
strFunction = window[arr[0]];
for(var i = 1, len = arr.length; i < len; i++) {
if(!strFunction && !_.isFunction(strFunction) && !_.isObject(strFunction)) {
return null;
}
strFunction = strFunction[arr[i]];
}
if(_.isFunction(strFunction)) {
if(falg) {
strFunction.apply(strFunction, functionObj.functionParams); //测试是否是方法可以测试出来
}
functionObj.fun = strFunction;
return functionObj;
}
}
return null;
}
return str;
}
});
var obj = _.getFunction("test",false); //fasle可以不填
_.exeFunction(obj);
1.支持默认全局函数调用
//测试全局函数
function test() {
alert("test");
}
_.getFunction("test",true);
2.支持对象函数调用
//测试对象函数
var obj = {
test: function() {
alert("obj.test");
}
}
_.getFunction("obj.test",true);
3.支持jquery插件函数调用
//测试jquery插件函数
;(function($) {
$.extend({
lay: {
alert: function() {
alert("$");
}
}
})
})(jQuery, undefined);
_.getFunction("$.lay.alert",true);
4.支持基础全局函数含简单参数使用
//测试基础函数参数
function test2(a, b, c) {
console.log("arr" + a + b + c);
alert("test2" + a + b + c);
}
_.getFunction("test2(1,2,3);",true);
//局部变量函数
var test12 = function(){
alert(test12);
}
_.getFunction("test12();",true);
//测试复杂函数参数
var a = $(document);
_.getFunction("test2("+a+",2,3);",true);
//
//写好单元测试
//测试全局函数
function test() {
alert("test");
}
_.getFunction("test",true);
//测试手动执行
var obj = _.getFunction("test",false); //fasle可以不填
_.exeFunction(obj);
//测试对象函数
var obj = {
test: function() {
alert("obj.test");
}
}
_.getFunction("obj.test",true);
//测试jquery插件函数
;(function($) {
$.extend({
lay: {
alert: function() {
alert("$");
}
}
})
})(jQuery, undefined);
_.getFunction("$.lay.alert",true);
//测试基础函数参数
function test2(a, b, c) {
console.log("arr" + a + b + c);
alert("test2" + a + b + c);
}
_.getFunction("test2(1,2,3);",true);
//以下不支持的
//局部变量函数
var test12 = function(){
alert(test12);
}
_.getFunction("test12();",true);
//测试复杂函数参数
var a = $(document);
_.getFunction("test2("+a+",2,3);",true);
//
//test.apply(null);
https://blog.csdn.net/xingmeiok/article/details/82901068