如何执行存储在变量/ var x =“function(){alert('a')}”中的函数

时间:2017-05-13 22:36:11

标签: javascript angularjs

我将如何做到这一点是javascipt

var x = 'function(){ ... }'
x = x.toFunction();
x();

例如我一直在使用var x = '...'; eval(x),但我读到这很糟糕而且很慢。

如果它有助于我想要完成的是运行一个作为属性传递给<loaded>的函数,例如:

HTML

 <p loaded="test, function(){alert('it worked!')}">

AngularJS

.directive('loaded', function() {
 return {
  restrict: 'A',
  link: function(scope, elem, attr) {
   var paramOne = attr.loaded.substr(0, attr.loaded.indexOf(',')) //paramOne = test
   var paramTwo = attr.loaded.substr(paramOne.length+1).trim() //paramTwo = "function(){alert('it worked!')"
   if (paramOne==='test') paramTwo() //This is where I use to use eval(paramTwo)
  }
 }
}) 

这是jsfiddle

*编辑:* 我不会将此作为答案发布,因为我还不确定......我可能做错了。

var x = "function(){alert('it worked!')";
x = new Function('(' + x + ')()');
x(); //alerts 'it worked!'

如果我的编辑是可行的答案,或者我应该采用全新的方法,请告诉我

1 个答案:

答案 0 :(得分:0)

我没有测试这段代码,但我认为这就是这个想法:

.directive('loaded', function() {
  return {
    restrict: 'A',
    scope: {
     fn: '&'
    }
    link: function(scope, elem, attr) {
      var paramOne = attr.param1;

      if (paramOne === 'test'){
        scope.fn();
      }
    }
  }
});

fn是您希望在链接功能中执行的功能。您可以在控制器内定义此功能。 param1是您应该在另一个属性中传递的参数(在这种情况下,此属性的值将为'test')。

<p loaded param1='test' fn='fn()'>