使用循环函数简化代码

Simplify the code by using cycle function

我有使用相同循环代码的乘法函数,我想知道是否可以通过使用一个循环函数来简化代码,这样我就可以通过调用所需的函数名称来执行代码。

现在:

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

需要:

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

我尝试使用 "window" 来执行此操作,我没有收到任何错误,但该功能未执行。

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");
    }
}

没有名字space使用:

window["functionName"](arguments);

所以把它包起来并这样使用它:

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

有名字space,包括:

window["Namespace"]["myfunction"](i);
window['lineGroup.lines['+i+'].'+callFunction+'()'];

字面意思 尝试访问以 lineGroups.lines[0] 开头的 属性。这样的 属性 只有当你明确地做了 window['lineGroups.lines[0]'] = ... 时才会存在,我相信你没有。

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

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

i get no error but the function is not executed.

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

window[';dghfodstf0ap9sdufgpas9df']

这会尝试访问 属性 ;dghfodstf0ap9sdufgpas9df,但由于它不存在,这将导致 undefined。由于未对 return 值进行任何操作,因此无法观察到任何变化。

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

// 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();