2013-02-28 87 views
0

我很好奇,如何能更好地这样写:JavaScript的变量范围在回调中

function Klass(variable) { 
    this.variable = variable; 

    this.callAjax = function() { 
     $.get('/url', { }, function(json) { 
      console.log(variable); //! <-- shows undefined 
     }, "json"); 
    } 
} 

所以我创建了一个局部变量:_variable

function Klass(variable) { 
    this.variable = variable; 

    this.callAjax = function() { 
     var _variable = this.variable; 
     $.get('/url', { }, function(json) { 
      console.log(_variable); //! <-- its ok 
     }, "json"); 
    } 
} 

和罚款,但我真不” t这个解决方案,

是否有人有更好的代码?

+2

'无功自我= this' – 2013-02-28 07:41:21

+0

'$获得(...函数(){...}绑定(本)。)' – 2013-02-28 07:41:48

+0

我看不到为什么'console.log(variable);'应该显示'undefined'。 'variables'应该引用构造函数的参数。你是否将'undefined'传递给构造函数并稍后设置'this.variable'? – 2013-02-28 07:47:10

回答

4

就是这样。

function(json){console.log(_variable);} 

与“_variable”形成一个闭包。 “_variable”永远保持原始值。

如果你的“变量”,应在稍后更新,并且要更新的“变量” 你定义

var self = this; 

,并呼吁self.variable得到它。

以这种方式,每次执行回调时都会得到更新的“变量”。

的完整代码:

function Klass(variable) { 
    var self = this; 
    this.variable = variable; 
    this.callAjax = function() { 
     $.get('/url', { }, function(json) { 
      console.log(self.variable); 
     }, "json"); 
    } 
} 
+0

您也可以在构造函数中声明'self',因为'callAjax'是一个特权方法(在构造函数中声明)。不过,你的方法比较好,因为它也可以用于原型方法。 – 2013-02-28 07:50:14

+1

你说得对,我想知道为什么问题的第一个案例不起作用。它应该工作,只是变量不会改变。 – 2013-02-28 08:11:17