2016-08-09 39 views
0

的範圍我只是想知道,如果是這樣就可以實現:jQuery的設置方法

假設我有我的圖書館內的事件回調定義:

var app = { 
 
     globals: { 
 
      foo: null 
 
     }, 
 
     bar: function(e) { 
 
      e.preventDefault(); 
 
      e.stopPropagation(); 
 
      if (typeof app.globals.foo === "function") app.globals.foo(e); 
 
     }, 
 
     init: function(options) { 
 
      $.extend(app.globals, options); 
 
      $(".myclass").on("click", function(e) { 
 
       app.bar(e); 
 
      }); 
 
     } 
 
    }; 
 

 
    $(document).ready(function() { 
 
     app.init({ 
 
      foo: function(evt) { 
 
       alert("clicked"); 
 
       console.log(evt.target); 
 
      } 
 
     }); 
 
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="myclass">Click Me!</div>

有了這個方法,我將「.myclass」元素的單擊事件數據傳遞給app.foo,因此將執行面向對象的方法。

TL; DR:問題是,我可以將foo的範圍設置爲發送點擊事件的對象嗎?所以:

app.init({ 
    foo: function(){ 
     console.log(this); 
    } 
}); 

將執行相同:

app.init({ 
    foo: function(evt){ 
     console.log(evt.target); 
    } 
}); 

是這樣的可能嗎?

+0

對你有用嗎?(具體來說,'app.foo'?) – Amit

+0

是的,它基本上可以工作。我寫的代碼沒有經過測試,只是寫在我頭上給你一個想法我的意思 –

+1

然後請確保你發佈有效的代碼,而不是scribbl ES。這段代碼被破壞了,討論它是毫無意義的。 – Amit

回答

1

可以控制在激活時該foo功能this值:

// ... 
if(typeof app.globals.foo === "function") app.globals.foo.call(e.target); 
// ... 

將設置this等於e.target,你會得到您所描述的行爲,但是...

這樣做不是一個好習慣。首先,如果foo被綁定到特定的this(例如通過foo.bind(someContext)這種方法將無法覆蓋該上下文;其次,當沒有真實的對象上下文時這是不自然的,因爲沒有真正的對象上下文 - 這就是函數參數的用法,常見的異常「(通常在jQuery回調中發現)將上下文傳遞給」孤立「回調函數,而不是」對象方法「,即使如此,由於相同的原因,很難證明這一點,函數參數更清晰而不是脆弱的。

+0

所以'.call(e.target)'是在那裏定義的範圍?我基本上需要一個點擊回調和點擊對象方法之間的橋樑,所以我可以安全地將整個點擊事件回調傳遞給該對象方法。例如,某人有一個充滿'$(this)'的方法(我知道,應該緩衝 - 壞習慣),並且他/她想要將該方法直接複製到庫中。這將是有益的。 –

+0

是的,它的工作。謝謝! –

+0

@TahaPaksu - 那通常會*工作,我只是覺得這是不好的建議。 – Amit