Javascript 在类中获取全局变量

Javascript 在类中获取全局变量,javascript,Javascript,我创建了一个javascript类,我想在每秒钟内调用一个方法,下面是我的代码: var MyClass = Base.extend({ myMethod: function() { setTimeout(function(){ var mc = new MyClass(); mc.myMethod(); }, 1000); } }); var myGlobalClass = new MyClass(

我创建了一个javascript类,我想在每秒钟内调用一个方法,下面是我的代码:

var MyClass = Base.extend({
    myMethod: function() {
        setTimeout(function(){
            var mc = new MyClass();
            mc.myMethod();
        }, 1000);
    }
});
var myGlobalClass = new MyClass();

myGlobalClass.myMethod();
实际上,这段代码很有效,但每次我都需要执行一个
newmyclass()

我希望使用
myGlobalClass

这可能吗

如果您考虑到这一点,那么在这种情况下,仅使用精度
this.myMethod()
是不可行的


感谢您的帮助

如果您想引用值
myGlobalClass
,那么您可以直接从函数中执行此操作

setTimeout(function(){
  myGlobalClass.myMethod();
}, 1000);

这是因为Javascript在解析名称时不只是查找在当前作用域中定义的局部变量。它也会查看所有父作用域来解析它们。在这种情况下,
myGlobalClass
是在全局范围内定义的。名称解析从
setTimeout
函数回调开始,在函数中找不到它,然后搜索
myMethod:function(){
在那里找不到它,然后它会在全局范围中查找并发现
myGlobalClass
。它会将名称解析为该值

如果您想引用值
myGlobalClass
,那么您可以直接从函数中执行此操作

setTimeout(function(){
  myGlobalClass.myMethod();
}, 1000);

这是因为Javascript在解析名称时不只是查找当前作用域中定义的局部变量。它还会查找所有父作用域来解析它们。在这种情况下,
myGlobalClass
是在全局作用域中定义的。名称解析从
setTimeout
函数回调开始,在函数,然后它将搜索
myMethod:function(){
但在那里找不到它,然后它将在全局范围中查找并发现
myGlobalClass
。它将把名称解析为该值

如果您有多个实例,则给函数一个名称并递归调用它

myMethod: function myMethod() {
    setTimeout(function(){
        myMethod();
    }, 1000);
}

这是IE8上的一个错误。

如果有多个实例,请为函数命名并递归调用它

myMethod: function myMethod() {
    setTimeout(function(){
        myMethod();
    }, 1000);
}

这是IE8上的错误。

如果您想每秒重复一次操作,您是否想过使用
setInterval
而不是
setTimeout
?那么
myMethod
就不必在每次调用时初始化超时

你可以这样做:

var MyClass = Base.extend({
    myMethod: function() {
        // do stuff here
    }
});

var myGlobalClass = new MyClass();

setInterval(myGlobalClass.myMethod, 1000);

如果您想每秒重复一次操作,是否考虑过使用
setInterval
而不是
setTimeout
?那么
myMethod
就不必在每次调用时初始化超时

你可以这样做:

var MyClass = Base.extend({
    myMethod: function() {
        // do stuff here
    }
});

var myGlobalClass = new MyClass();

setInterval(myGlobalClass.myMethod, 1000);

而不是使用
setTimeout
递归调用方法。您可以使用
setInterval
,这使您的代码更加清晰

    var MyClass = Base.extend({
        myMethod: function() {
           //..
        }
    });
   var myGlobalClass = new MyClass();
   setInterval(myGlobalClass.myMethod, 1000);

而不是使用
setTimeout
递归调用方法。您可以使用
setInterval
,这使您的代码更加清晰

    var MyClass = Base.extend({
        myMethod: function() {
           //..
        }
    });
   var myGlobalClass = new MyClass();
   setInterval(myGlobalClass.myMethod, 1000);

我第一次听说javascript中有一个匿名函数叫做lambda。这个想法很有趣。哦……我做了那个id不起作用我想我需要做些别的事情,我再试了一次,这次它起作用了……我有点惭愧,因为这是逻辑。谢谢你的回复(我会在10分钟内接受)@jbabey我更改了答案,删除了对lambda的引用,以避免与即将推出的ECMA版本中拟议的lambda功能混淆。我第一次听说javascript中有一个名为lambda的匿名函数。有趣的想法。哦……我这么做了,id不起作用,我认为我需要做其他事情,我再次尝试,这次它起作用了。…我有点惭愧,因为这是合乎逻辑的。谢谢你的回复(我会在10分钟内接受)@jbabey我更改了答案,删除了对lambda的引用,以避免与即将发布的ECMA版本中拟议的lambda功能混淆在我看来,使用多个实例通常是个坏主意。修复起来非常简单,所以只需要一个实例。@Jon:但为什么他要使用
new
和所有这些?如果只有一个实例ce,我只想使用一个普通对象。他必须创建至少一个实例来引用该方法。但一旦他有了引用,就不需要创建新的引用。事实上,他甚至不需要@JaredPar的答案所示的一个引用。有趣的是,我不知道我们可以这样做,但我认为+JaredPar的答案做到了,继续使用多个实例通常是一个坏主意。修复起来非常简单,所以只需要一个实例。@Jon:但为什么他要使用
new
和所有实例?如果只有一个实例,我就使用普通对象。他必须创建至少一个实例来引用该方法。但一旦他有了引用,就没有必要了做一个新的。事实上,他甚至不需要@JaredPar的答案所显示的一个参考。有趣的是,我不知道我们能做到这一点,但+JaredPar的答案是我知道的。我从来没有搜索过差异,这里我不需要绝对的精确性,但感谢你让我搜索,至少我知道我以前的bug是从哪里来的这类事情;-)好吧,我从来没有搜索过差异,这里我不需要绝对的精确性,但谢谢你让我搜索,至少我知道我以前做这类事情时的错误来自哪里;-)