2010-05-04 5 views
3

В использовании обратного вызова jquery я обнаружил, что «это» больше не определено. Я нашел работу, которая должна установить «это» для другой переменной. Например, вот так:Могу ли я увеличить объем «этого» в следующем примере?

function handler(DATA) { 
     var myThis = this; 

     $.post(
      'file.php', 
      DATA, 
      function() { 

       // THIS where I need access to 'this', but its not available 
       // unless I've used the 'myThis' trick above 

      } 
     ); 
} 

Он работает, как это, но я всегда искал «правильный путь» или «лучший способ» делать вещи.

Это лучший способ? или есть другой?

+1

Вы, вероятно, хотите, чтобы бросить 'var' перед' myThis = этого; ', но так, как вы делаете это обычная практика – PetersenDidIt

ответ

5

Это прекрасно. Я делаю это все время в своих проектах, особенно с вызовами Ajax.

Но, не забудьте поставить var до myThis, иначе он будет объявлен в глобальном масштабе, который вам определенно не нужен.

function handler(DATA) { 
     var myThis = this; 

     $.post(
      'file.php', 
      DATA, 
      function() { 

       // THIS where I need access to 'this', but its not available 
       // unless I've used the 'myThis' trick above 

      } 
     ); 
} 
+0

Да, я на самом деле был вар в моем коде, но я не сделал копировать/вставлять по любой причине :) Я надеялся, что есть более плавный, гладкий способ, но не всегда. – Stomped

1

Мне нравится использовать «себя»:

function handler(DATA) { 
    var self = this; 
    $.ajax({ 
     "url":"file.php", 
     "type":"post", 
     "data":DATA, 
     "success":function() { 
      // THIS where I need access to 'this', but its not available 
      // unless I've used the 'myThis' trick above 
     }, 
     "error":function(){ 
      alert("ERROR!") 
     } 
    }); 
} 

вы можете также использовать метод прокси-JQuery ... но это, вероятно, будет излишним для этой ситуации.

function handler(DATA) { 
    var success = $.proxy(function(){ 
     // use "this" in this function to refer to the scope 
     // you were assigning to "myThis" in your example 
    }, this); 
    $.ajax({ 
     "url":"file.php", 
     "type":"post", 
     "data":DATA, 
     "success":success, 
     "error":function(){} 
    }); 
} 
Смежные вопросы