使用数据值作为名称来执行匹配函数

时间:2016-04-04 08:34:25

标签: javascript jquery tweenmax

我使用jquery .data()获取html数据并将其拆分为函数名,但名称是字符串,而不是函数,我想使用字符串名称执行匹配函数。

在这个演示中,我得到的字符串名称是 scale和scaleY ,如何使用名称执行scale和scaleY函数? 非常感谢!

这样的错误:

for (var i = 0; i < useData.length; i++) {
  var funName = useData[i],
  var excFun = new Function(funName);
  excFun();
  console.log(useData[i]);                      
}

/////////////////////////////////////////////// ///////////

<section class="boxed">
  <div class="tweenItems">
    <h3 data-tween="scale scaleY"> test scale</h3>
    <h3 data-tween="scale scaleY"> test scale</h3>
    <h3 data-tween="scale scaleY"> test scale</h3>
    <h3 data-tween="scale scaleY"> test scale</h3>
    <h3 data-tween="scale scaleY"> test scale</h3>
  </div>
</section>

&#13;
&#13;
var scale = function(dir) {
  TweenMax.set(tweenItem, {opacity:1});
  TweenMax.staggerFrom(tweenItem, 0.8, {
    "opacity":1,
    scale:0 * dir,
    delay:0.8
  }, 0.1);
}

var scaleY = function(dir) {
  TweenMax.set(tweenItem, {opacity:1});
  TweenMax.staggerFrom(tweenItem, 0.8, {
    "opacity":1,
    scaleY:0 * dir,
    delay:0.8
  }, 0.1);
}

var tweenData = tweenItem.data("tween");					

var useData = tweenData.split(" ");
console.log(useData.length);


for (var i = 0; i < useData.length; i++) {


  var funName = useData[i],
  var excFun = new Function(funName);
  excFun();

  console.log(useData[i]);						
}
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:0)

是的我修复了一个错误

for (var i = 0; i < useData.length; i++) {
var funName = useData[i]; 
var excFun = new Function(funName);
excFun();
}

但是控制台给我这个:

未捕获的ReferenceError:未定义比例 为什么未定义比例以及如何修复我的代码 谢谢++

答案 1 :(得分:0)

我想到两件事:功能提升和eval()。

由于函数提升,比例可能未定义(比例在运行时定义为变量,而不是在运行时之前的分析时执行的函数)。如果这是问题,您可以通过重新定义功能来解决此问题。

示例:

var scale = function(dir) { ... }

成为

function scale(dir) { ... }

我发现奇怪的另一件事是你正在使用Function构造函数通过string(函数名称)创建对函数的引用。我建议尝试使用eval,也许包装在一个试图捕获以确保安全。

示例:

而不是

var excFun = new Function(funName);

eval(funName + '()');

你可以摆脱整个for循环:

useData.forEach(function(fnName) { eval(fnName + '()'); });