在对象上调用方法调用之外的变量而不使它们成为全局变量(是否可能?)

时间:2016-03-02 16:06:14

标签: javascript function variables

我发现我有两个函数共享一些代码所以我决定把它放在一个模板函数中:

function template(callback){
  var all, these, variables, are, used, inthe, callbackFunction;
  for (var i=0; i<10; i++){
      callback();
  }
}
function myFirstFunction(){
   //do something with all those variables
}
function mySecondFunction(){
   //do something else
}

因此,对于每个功能,我都会调用template(myFirstFunction)template(mySecondFunction)

有没有什么方法可以使用我的函数中的 template 函数中定义的所有变量而不通过参数传递它们?

编辑:

我的函数实际上是对象的方法:

function MyObject(){

};
MyObject.prototype.template = function(){ 
  var all, these, variables, are, used, inthe, callbackFunction;
  for (var i=0; i<10; i++){
    callback();
  }};
MyObject.prototype.myFirstMethod = function(){ 
    this.template(function(){
        //doSomething with all those variables
    });
};
 MyObject.prototype.mySecondMethod = function(){ 
    this.template(function(){
        //doSomething else
    });
};

3 个答案:

答案 0 :(得分:8)

呜!范围问题!您需要在函数的本地范围之外声明变量。像这样:

var all, these, variables, are, used, inthe, callbackFunction;
function template(callback){
  for (var i=0; i<10; i++){
      callback();
  }
}
function myFirstFunction(){
   //do something with all those variables
}
function mySecondFunction(){
   //do something else
}

然后,您可以在每个功能中访问它们。如果你是新手,范围可能会很棘手,我建议你阅读它。

答案 1 :(得分:0)

如果您想阻止polluting the global namespace,可以将所有内容都包含在a self-executing function中:

var MyObject = (function() {
    var all, these, variables, are, used, inthe, callbackFunction;

    var o = function() {
        // Do stuff
    };

    o.prototype.template = function(){ 
        for (var i=0; i<10; i++) {
            callback();
        }
    };

    o.prototype.myFirstMethod = function(){ 
        this.template(function() {
            // Do something with all those variables
        });
    };

    o.prototype.mySecondMethod = function(){ 
        this.template(function() {
            // Do something else
        });
    };

    return o;
})();

进一步阅读:

Implementing Private and Protected Members in JavaScript

答案 2 :(得分:0)

我自己,我将它们放在一个地方,而不会污染范围:

MyObject.prototype.template = function(){ 
    this.params = {all: '', these: '', variables: '', etc: ''}
    for (var i=0; i<10; i++){
        callback();
}};

MyObject.prototype.myFirstMethod = function(){ 
    var self = this;
    this.template(function(){
        console.log(self.params);
    });
};