2015-09-29 42 views
1

如果我將一個函數作爲參數傳遞,並且該函數是一個jQuery方法,稍後將調用傳遞的函數仍然正確設置this?我以爲會這樣,但是稍後調用該函數有this = Window通過後續評估的方法

示例代碼:

var $input = $('input').first(); 

var evaluators = []; 

evaluators.push($input.val); 

_.forEach(evaluators, function(valueMethod) { 
    return valueMethod() //returns undefined always since this = window 
}). 
+0

你的意思是'$ input.val'? – Stryner

+0

是的。現在修復。 –

回答

3

嘗試使用bind

的bind()方法創建一個新的功能,調用它時,具有其將此關鍵字設置爲所提供的值,具有在調用新函數時提供的任何參數序列。

evaluators.push($input.val.bind($input)); 

值得注意bindnot supported on older browsers(例如IE8和FF3(或舊的))。

+0

這就是我期望必須做的。這是否意味着如果你直接從像obj.prototypeMethod()這樣的對象實例中調用函數,JS只會正確設置'this'? –

+0

你說得對,我已經添加了兼容表的鏈接 – mbinette

+0

這是正確的。基本上,'input.val'指的是函數本身,沒有它的上下文(例如原型方法)。上下文在您撥打電話時通過。 'bind'的作用是創建一個新的函數,它包裝原始函數,定義作爲參數傳遞的上下文。 – mbinette