2015-02-09 51 views
2

我有一個JavaScript代碼,使用一個函數和鍵,我可以使用「this」對象,但我添加了一個部分jsonp消費Web服務,我不能訪問「this」對象,迫使更改所有代碼以將整個路線從窗口中移除。這是我的原始代碼:JSONP和對象這

(function() { 
    "use strict"; 

    console.log("Hello World!"); 
    window.programOne = window.programOne || {}; 

    programOne = { 

     varS: { 
      var1: "One", 
      var2: null, 
      var3: "Two" 
     }, 
     demo: function(data){ 

      console.log(JSON.stringify(data)); 
     }, 
     execute: function(values){ 

      // Works correctly when calling from programOne.execute({ "item": "Lorem"}); 
      //this.demo(values); 
      //> { "item": "Lorem"} 
      //this.varS.var2 = values; 
      //console.log(this.varS.var1); 

      console.log(this); 
      //It is necessary to use it with the callback. The "this" is undefined object. 
      //Does not work here inside "this" object? 
      // this.demo(values); 
      window.programOne.demo(values); 
     }, 
     start: function(){ 

      window.executeMyCB = programOne.execute; 

      var script = document.createElement('script'); 
      script.src = "http://whatever.com/the/script.js&callback=executeMyCB"; 
      document.getElementsByTagName('head')[0].appendChild(script); 
     } 
    }; 

    // Demo 
    programOne.execute({ "item": "Lorem"}); 

    programOne.start(); 

}()); 

可以訪問對象的函數和變量而不必用「窗口」指定它?從自己的腳本獲得訪問權限,但由於運行jsonp的函數(window.executeMyCB)不會讓我使用「this」。我認爲,作爲JavaScript的新手,我不太瞭解,並適應這些代碼解決了我的錯誤,並理解我對這個對象的問題/操作。

感謝

回答

1

使用Function.prototype.bind對象綁定到您所創建的全局函數:

window.executeMyCB = programOne.execute.bind(programOne); 

或者嘗試改變調用通過對象訪問方法。不知道這是否會與您的服務或無法正常工作:

"http://whatever.com/the/script.js&callback=programOne.execute" 

既然你有一個jQuery的標籤,你也可以使用$.proxy而不是.bind()如果你支持舊版瀏覽器。

window.executeMyCB = $.proxy(programOne, "execute"); 
+0

謝謝。它工作正常,我現在正在閱讀關於綁定,以瞭解它爲什麼起作用 – Anto 2015-02-10 16:26:13