2015-11-03 69 views
0

我有多个使用相同循环代码的函数,我想知道是否有可能通过使用一个循环函数来简化代码,所以我可以通过调用想要的函数名称来执行代码。使用循环功能简化代码

现在:

for(var i=0;i<all;i++){ someFunction(i) } 

极品:

cycle(someFunction); 
function cycle(name){ 
    for(var i=0;i<all;i++){ 
     name(i); 
    } 
} 

我试图通过使用“窗口”要做到这一点,我没有错误,但不会执行该功能。

var MyLines = new lineGroup(); 
MyLines.createLines(); // works 
MyLines.addSpeed(); // doesn't work 


var lineGroup = function(){ 
    this.lAmount = 5, 
    this.lines = [], 

    this.createLines = function(){ 
     for(var i=0,all=this.lAmount;i<all;i++){ 
      this.lines[i] = new line(); 
     } 
    }, 

    this.addSpeed = function(){ 
     // no error, but it's not executing addSpeed function 
     // if i write here a normal cycle like in createLines function 
     // it's working ok 
     this.linesCycle("addSpeed"); 
    }, 
    this.linesCycle = function(callFunction){ 
     for(var i=0,all=this.lAmount;i<all;i++){ 
      window['lineGroup.lines['+i+'].'+callFunction+'()']; 
     } 
    } 
} 

var line = function(){ 
    this.addSpeed = function(){ 
     console.log("works"); 
    } 
} 

回答

1
window['lineGroup.lines['+i+'].'+callFunction+'()']; 

字面上试图访问以lineGroups.lines[0]开头的属性。这样的财产只会存在,如果你明确做window['lineGroups.lines[0]'] = ...,我相信你没有。

完全没有必要涉及window。刚刚访问对象的属性line

this.lines[i][callFunction](); 

我没有错误,但不会执行该功能。

访问不存在的属性不会产生错误。例如:

window[';dghfodstf0ap9sdufgpas9df']

这将尝试访问属性;dghfodstf0ap9sdufgpas9df,但由于它不存在,这将导致undefined。由于返回值没有做任何事情,所以没有观察到变化。

+0

工程就像一个魅力;) – wyy

1

如果没有名称空间的使用:

window["functionName"](arguments); 

SO包起来,因此使用它:

cycle(someFunction); 
function cycle(name){ 
    for(var i=0;i<all;i++){ 
     window[name](i);; 
    } 
} 

与命名空间,包括:

window["Namespace"]["myfunction"](i); 
1

请注意,这可能有点矫枉过正,但使用函数来创建一个类对象(您可以谷歌makeClass和它为什么/可能是有用的),你可以创建对象的实例。

// makeClass - By Hubert Kauker (MIT Licensed) 
// original by John Resig (MIT Licensed). 
function makeClass() { 
    var isInternal; 
    return function (args) { 
     if (this instanceof arguments.callee) { 
      if (typeof this.init == "function") { 
       this.init.apply(this, isInternal ? args : arguments); 
      } 
     } else { 
      isInternal = true; 
      var instance = new arguments.callee(arguments); 
      isInternal = false; 
      return instance; 
     } 
    }; 
} 
var line = function() { 
    this.addSpeed = function() { 
     console.log("works"); 
    }; 
}; 
var LineGroup = makeClass(); 

LineGroup.prototype.init = function (lineNumber) { 
    this.lAmount = lineNumber?lineNumber:5, 
    this.lines = [], 

    this.createLines = function (mything) { 
     console.log(mything); 
     var i = 0; 
     for (; i < this.lAmount; i++) { 
      this.lines[i] = new line(); 
     } 
    }, 

    this.addSpeed = function() { 
     console.log("here"); 
     this.linesCycle("addSpeed"); 
    }, 
    this.linesCycle = function (callFunction) { 
     console.log("called:" + callFunction); 
     var i = 0; 
     for (; i < this.lAmount; i++) { 
      this.lines[i][callFunction](); 
     } 
    }; 
}; 
var myLines = LineGroup(); 
myLines.createLines("createlines"); 
myLines.addSpeed(); 
//now add a new instance with 3 "lines" 
var newLines = LineGroup(3); 
newLines.createLines("createlines2") 
console.log("addspeed is a:" + typeof newLines.addSpeed); 
console.log("line count"+newLines.lAmount); 
newLines.addSpeed();