2011-03-17 49 views
3

這取自John Resig的學習高級Javascript#25,稱爲更改函數的上下文。在JavaScript中更改函數的上下文

1)在行fn() == this這是指什麼?它是指這裏面的功能,它說這個返回? 2)雖然我理解最後一行(將函數附加到特定對象)的目的,但我不明白代碼如何執行該操作。單詞「call」是一個預定義的JavaScript函數嗎?用通俗的語言,請解釋「fn.call(對象)」,並明確告訴我,對象(object)是否與var object是同一個對象。 3)。功能分配給對象後,您是否會通過編寫object.fn();來調用該功能?

var object = {}; 
function fn(){ 
    return this; 
} 
assert(fn() == this, "The context is the global object."); 
assert(fn.call(object) == object, "The context is changed to a specific object." 

回答

6

callFunction對象定義的函數。 call的第一個參數是this在被調用函數內引用的對象。

fn()被調用時沒有任何特定的上下文,this是指瀏覽器環境中的全局上下文或window對象。在全球範圍內,this的值相同。所以在fn() == this),this也是指全局對象。但是,如果在fn.call(object)的範圍內調用某個其他對象時,fn內的this指的是object

fn.call(object)根本不會修改或分配任何東西給object。唯一受影響的是fn內的this值僅在該呼叫期間。所以即使在此通話之後,您仍然會按照常規方式繼續撥打fn(),而不是撥打object.fn()

該示例簡單地演示了函數內的this值是動態的。

+0

關於答案中的第一段(即調用和對象),是否總是這種情況或僅僅是這個特定的代碼?非常感謝您的幫助。 – mjmitche 2011-03-17 04:52:05

+0

當使用'call'或'apply'調用一個函數時,第一個參數將始終決定該函數內的'this'值。情況總是如此 – Anurag 2011-03-17 04:57:48