通常创建一个新功能

时间:2014-11-25 22:21:02

标签: javascript function generics

我不知道问题是否正确,但我想知道是否可以通用地创建函数? 让我们说而不是这样做:

function f1{
  $("#pictureID1").remove();
}

function f2{
  $("#pictureID2").remove();
}

JSON

var content = [
   {"functionname": "f1", "image": "pictureID1"},
   {"functionname": "f2", "image": "pictureID2"},
];

我想像这样自动创建它们:

for(var i=1;i<=2;i++{
    new function content[i].functionname(){
       $("#"+content.image).remove();
    }
}

提前致谢,

马克

4 个答案:

答案 0 :(得分:1)

创建一个函数工厂:

function factory(name, fn) {
    window[name] = fn
}

for(var i=1;i<=2;i++)
    factory('f'+i, function() { /*...*/ })

答案 1 :(得分:0)

在javascript中,函数也可以这样声明:

var func = function() { alert('hello'); }

func(); // call the function

所以你可以创建一系列函数......就像这样:

var arr = [];

for(var i = 0; i < 2; i++) // there is no 'int' in javascript - the language is NOT strongly-typed
{
    var x = 'hello ' + (i + 1);

    arr.push(function()
    {
        alert(x);
    });
}

arr[0](); // call the first function

答案 2 :(得分:0)

你可以稍微简单一点地做到这一点:

var functions = {}; // this object will store all the generated functions

for(var i=1;i<=2;i++)
    functions['f' + i] = function(){}

然后您可以访问生成的函数,例如functions.f1()

基本上它就像David所说的那样,只有他使用全局window对象而我正在使用我自己创建的对象,而不是污染全局对象并可能暴露于冲突。 / p>

答案 3 :(得分:0)

事实上,它非常简单。真正的问题是:为什么?你应该没有理由这样做,因为如果函数是相同的(在你的情况下将是这样),那么你只需要一个函数。只需将“上下文”作为额外参数传递给它。或者,定义一个对象原型并使用实际对象。

那就是说,让我们动态制作一些功能!在现实世界中,这将被标记为“你正在做什么,这是非常糟糕的做法”,顺便说一下。不仅仅是人,还有jslint和jshint等javascript代码验证器。

for(var i=0; i<10; i++) {
  this["f"+i] = function() {
    console.log("lols!");
  };
}

f4(); // says "lols!"

如果你希望那个i工作,那么你点击“你在做什么,这都是错的”,因为你可能想要这样做:

for(var i=0; i<10; i++) {
  this["f"+i] = function() {
    console.log("lol "+i+"!");
  };
}

f4(); // says "lol 10!" ... wait what?

这就是说“lol 10”,因为变量i在所有函数绑定后都是10,然后当你调用f4()时,var被检查,10是发现,它说“10”。不那么方便。

for(var i=0; i<10; i++) {
  this["f"+i] = (function(v) {
    return function() {
      console.log("lol "+v+"!");
    };
  }(i));
}

f4(); // says "lol 4!", sweet!

现在它会说正确的事情,但我们已经正确地击中了“你正在做什么”的糟糕编码水平。这绝对没有意义,真正的问题是我们需要这些功能。实际上,这种方法并不比解决问题的“真实”方法更好。例如,您需要生成特定数字重要的函数输出吗?好的,我们这样做:

function pipenum(i) {
  console.log("lol "+i+"!");
}

pipenum(4); // says "lol 4!". Obviously.

如果您作为人类编写源代码,可以编写“f4()”,那么您也可以编写“pipenum(4)”。你基本上只是移动了(,这甚至不是努力。它和动态代码一样容易使用:

var arg = 4; // obtained from user, or file, or whatever
this["f" + arg](...);

很奇怪,需要奇怪的功能设置,而:

var arg = 4; // still obtained from user, or file, or whatever
this.pipenum(arg);

是普通的常规JS。没有人会盯着它,jslint / jshint也不会看到任何与众不同的东西。