2015-04-28 67 views
1

考慮下面的代碼,我們可以看到,閉包幫助包含的變量的值其範圍內:鑑於JavaScript已關閉,此關鍵字的用途究竟是什麼?

var f = new Foo('jim','jam'); 
var b = new Bar('saul','paul'); 
var bz = new Baz(); 

function Foo(jim,jam){ 

    this.jim = jim; 
    this.jam = jam; 

    function log(){ 
     console.log('jim:',jim,'jam:',jam); 
    } 

    return log; 
} 


function Bar(jim,jam){ 

    function log(){ 
     console.log('jim:',jim,'jam:',jam); 
    } 

    return log; 
} 

function Baz(jim,jam){ 

    this.jim = 'bark'; 
    this.jam = 'catch'; 


    function log(){ 
     console.log('jim:',this.jim,'jam:',this.jam); 
    } 

    return log; 
} 

f(); 
b(); 
bz(); 

那麼,究竟是什麼「this」在JavaScript中則關鍵字的目的是什麼?它何時變得有必要?

+0

了'this'關鍵字允許一個變量傳遞到函數的範圍沒有它在功能參數。所以如果我試圖在工廠中引用窗口並且窗口不可用,我可以調用我的函數,如'myClass ['myfunction']。call(window,args);'有效地傳遞窗口。 – r3wt

+2

有點難以分辨究竟是什麼讓你感到困惑。局部變量範圍和閉包以及對象上下文之間確實沒有多少共同之處。 – Pointy

+0

@Points重疊是似乎通過從外部函數返回一個內部函數,您可以引用這些變量,就好像它們是實例變量 –

回答

2

this關鍵字用於訪問當前上下文,它與當前範圍不一樣。

如果你調用一個對象的方法,那個調用的上下文就是對象。您可以使用this關鍵字的對象來訪問屬性:

function Foo(jim,jam){ 
 
    this.x = jim; 
 
    this.y = jam; 
 
} 
 

 
Foo.prototype.log = function(){ 
 
    document.write('jim:' + this.x + ', jam:' + this.y); 
 
}; 
 

 
var f = new Foo('jim','jam'); 
 
f.log();

2

當必須顯式引用上下文對象時,this關鍵字是必需的。你的函數並不是很好的例子,因爲你已經爲函數參數使用了相同的對象屬性名稱。如果你讓他們有所不同,它可能會更清楚:

function Foo(pjim, pjam){ 

    this.jim = pjim; 
    this.jam = pjam; 

    function log(){ 
     console.log('jim:',jim,'jam:',jam); 
    } 

    return log; 
} 

該版本將基本不起作用 - 姓名「吉姆」和「大灌籃」將不對應於log函數的任何信息。

相關問題