2014-04-11 45 views
0

我試圖在由對象的方法調用的函數內部使用關鍵字this。在該方法的範圍內,值爲this是對象。但是,在該方法調用的函數範圍內,this的值不是對象。javascript:方法調用的函數內的「this」的值

我想通了,如果我通過this作爲參數,該功能的作品。當字面使用this時,該功能不起作用。

我知道this裏面的值是一個方法的對象。什麼規則決定了該方法調用的函數範圍內的this的值?在定義函數的時間/範圍(而不是在被調用的時間/範圍),它是否爲this的值?

錯誤的代碼:

var setHeightTop = function(h,t){ 
    var prevWellHeight = $(this).parent().prev().height(); 
    $(this).css({ 
    "height": function() {return (prevWellHeight - h);}, 
    "top": function() {return -(prevWellHeight - t);} 
    }); 
}; 

var recalcConnectorLines = function() { 
    $(".well + .well > .connectLine").each(function() { 
    setHeightTop(1,28); 
    }); 
}; 

運作代碼:

var setHeightTop = function(obj,h,t){ 
    var prevWellHeight = $(obj).parent().prev().height(); 
    $(obj).css({ 
    "height": function() {return (prevWellHeight - h);}, 
    "top": function() {return -(prevWellHeight - t);} 
    }); 
}; 

var recalcConnectorLines = function() { 
    $(".well + .well > .connectLine").each(function() { 
    setHeightTop(this,1,28); 
    }); 

編輯:解。

基於Mentok的鏈接,我已經想通了兩件事情:

  1. this在函數的值設置爲時間函數定義 。這解釋了我在錯誤的 代碼中看到的行爲。

  2. 但是,如果我調用我的函數作爲方法,this將被定義在 時間該方法被調用。

正如在jQuery文檔中解釋的here,可能會向jQuery對象添加新方法。

我改進的幹代碼:

$.fn.setHeightTop = function(h,t) { 
    $(this).each(function() { 
    var prevWellHeight = $(this).parent().prev().height(); 
    $(this).css({ 
     "height": function() {return (prevWellHeight - h);}, 
     "top": function() {return -(prevWellHeight - t);} 
    }); 
    }); 

}; 

var recalcConnectorLines = function() { 
    $(".well + .well > .connectLine").setHeightTop(1,28); 
}; 

它的工作原理!

+3

檢查[this](http://www.quirksmode.org/js/this.html)out(雙關意圖) – Mentok

+0

當函數被調用作爲該對象的一個​​方法時,它將採用一個對象的值, '這樣做是正確的,但這種情況發生的唯一方法是通過使用notation object.method或object [「method」]將該方法作爲對象的屬性來調用。在你的例子中,這個值是由jQuery – user3417400

+0

@Mentok定義的:這有幫助!但是,這意味着每次我想使用該函數時,都需要設置一個等於該函數的變量。我打算在一些對象上使用這個函數。有沒有辦法減少冗餘?我將該函數定義爲所有jQuery對象的方法嗎? –

回答

0

有什麼不對現有setHeightTop(OBJ,H,T)

.each(function(el,idx) { 
    setHeightTop(el,1,28); 
}) 

自動調用setHeight(H,T)有一個 「本」 對象沒有上下文。現有的功能應該可以正常工作。

+0

我認爲它本身沒有問題。我現在明白爲什麼'setHeight(h,t)'不起作用。每次我調用函數時,將'this'作爲第一個參數似乎是重複的。我仍然試圖找出是否有更優雅的解決方案。 –

相關問題