我有使用相同循环代码的乘法函数,我想知道是否可以通过一个循环函数来简化代码,这样我就可以通过调用想要的函数名来执行代码。
现在:
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");
}
}
答案 0 :(得分:1)
没有名称空间使用:
window["functionName"](arguments);
将它包起来并使用它:
cycle(someFunction);
function cycle(name){
for(var i=0;i<all;i++){
window[name](i);;
}
}
使用命名空间,包括:
window["Namespace"]["myfunction"](i);
答案 1 :(得分:1)
window['lineGroup.lines['+i+'].'+callFunction+'()'];
字面上尝试访问以lineGroups.lines[0]
开头的属性。只有当你明确做出window['lineGroups.lines[0]'] = ...
我确定你没有这样做时,这样的属性才会存在。
根本不需要涉及window
。只需访问对象的line
属性:
this.lines[i][callFunction]();
我没有收到任何错误但是没有执行该功能。
访问不存在的属性不会产生错误。例如:
window[';dghfodstf0ap9sdufgpas9df']
&#13;
这会尝试访问属性;dghfodstf0ap9sdufgpas9df
,但由于它不存在,这将导致undefined
。由于没有对返回值进行任何操作,因此无法观察到任何变化。
答案 2 :(得分:1)
请注意,这可能有点过分,但使用函数创建类对象(您可以google 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();