2012-01-18 58 views
1

是否可以使用javascript的call method(如[mdn文檔]中所述) 以便通過參數this如何在jQuery中使用javascript調用方法?

例如具有這樣的代碼:

console.log(this); 
$('#image_id').load(function() { 
    console.log(this); 
}); 

我想要(在load function包括一個)第二this是指相同的第一個。

我試着

console.log(this); 
$('#image_id').load.call(this, function() { 
    console.log(this); 
}); 

但它不工作。

非常感謝您提前給出任何建議。

回答

3

不是這樣,因爲你沒有調用回調函數。它被內部調用。

雖然你可以使用.bind

console.log(this); 
$('#image_id').load(function() { 
    console.log(this); 
}.bind(this)); 

但它不適用於舊版瀏覽器。 (這是原生.bind(),沒有jQuery的。)


jQuery有東西,將工作稱爲$.proxy ...

console.log(this); 
$('#image_id').load($.proxy(function() { 
    console.log(this); 
},this)); 

...其中第一個參數是你的函數,而第二個參數是您想要在回調中使用this的值。

+0

謝謝他們都完美的工作! 那麼,你認爲即使使用舊版瀏覽器,第二個也可以正常工作嗎?你可以在第二個方案中加載 它可能是$('#image_id')。load($。proxy(function(){ – 2012-01-19 09:39:00

+0

)即使是舊的瀏覽器,平板電腦和重碼也不一樣,可能是因爲它太近了 – 2012-01-19 11:29:03

+0

@LucaBorrione:是的,原生的'.bind'在舊版瀏覽器中不起作用,但jQuery的' $ .proxy'被設計成可以在那些較舊的版本上工作,謝謝你在流浪漢頭上的提問''。我將刪除它。:) – 2012-01-19 15:39:27

5

你不需要call(或apply

你應該這樣做,而不是:

var that = this; 
console.log(this); 
$('#image_id').load(function() { 
    console.log(that); 
}); 

JavaScript有詞法範圍,這意味着該變量that是提供給您的回調,並有它的定義的價值。在這種情況下,that在外部範圍內定義爲this

+0

我早知道是這樣,我應該提到它。 我正在尋找一種在load函數中使用'this'的方法,就像綁定一樣。我應該更好地闡明它。無論如何謝謝你的意見,至少它在任何情況下都能很好地工作。 – 2012-01-19 09:47:30

2

是的,你可以.call jQuerys與任何功能,但隻影響該功能。你傳遞的函數是一個獨立的回調函數,this由jQuery控制。

您可以使用$.proxy強制回調的上下文。

$('#image_id').bind("load", $.proxy(console.log, console, this)); 

如果你希望做的比記錄更變得更加難看:

$('#image_id').bind("load", $.proxy(function(){ 
    console.log(this); 
    alert(this); 
}, this)); 
+0

你的第一個例子也非常有趣,謝謝 基本上你的答案是同樣的'我不是',我查了一個,只是因爲我發現他的第一個解決方案更加清晰,但這只是我自己的口味。再次感謝 – 2012-01-19 09:53:12

+0

@LucaBorrione基本上你可以直接通過ab ound控制檯日誌,而不必做一個只調用console.log的包裝函數。但是,這隻適用於你只想在處理程序中調用一個函數:P – Esailija 2012-01-19 10:00:23

+0

我不知道我是否抓到你,無論如何,我的函數只是一個例子。 – 2012-01-19 10:22:21

1
var self = this; 
$('#image_id').load(function(){ 
    (function(){ 
     console.log(this); 
    }).call(self); 
}); 
+0

您好,從語法的角度來看,這是一個非常有趣的解決方案。注意:在load之後忘了'.call',它應該是'$('#image_id')。load(function(){'...弱點是你需要在外面定義'self'。 。你不能使用'})。call(this);'..所以基本上和'hvgotcodes'顯示的'load function'內直接使用'self'是一樣的。使用'bind'的解決方案更快更簡單。無論如何,要指出它。 – 2012-01-19 10:08:18

+0

@Luca Borrione:感謝您發現錯誤。關於解決方案,我同意使用'bind'你有一個更清晰可讀的解決方案,但是你應該記住它是ecmascript的一個新增內容,所以它可能不適用於所有瀏覽器(請看這裏請參閱此功能的可用性:http://kangax.github.com/es5-compat-table/)。我的解決方案在某些情況下可能會更好,因爲它不需要更改處理程序中的實際代碼;這樣你可以在不同的上下文中使用相同的處理程序,而不需要重寫上下文引用。 – 2012-01-19 10:45:10

+0

你完全正確:) – 2012-01-19 11:30:22

相關問題