2011-10-05 46 views
2

我學習JavaScript和我碰到下面的代碼片段來了:瓶蓋的JavaScript和Java

var outerValue = true; 

function outerFn(){ 
    assert(outerFn && outerValue, "These come from the closure."); 
} 

據我瞭解在上述背景下倒閉,它們允許outerFn實際看到的outerValue變量。

那麼我的問題是:這與其他任何編程語言有什麼不同?例如java?預計outerValue的作用域將允許outerFn看到它。

後來添加上:

var outerValue = true; 
    function outerFn() { 
     console.log(outerValue); 
    } 

    function anotherFunction(arg){ 
     console.log("anotherFunction"); 
     arg.call(this); 
    } 

    anotherFunction(outerFn); 

那麼這是一個封閉的一個更好的例子嗎?

回答

1

您的例子並不真正說明的區別,因爲你沒有定義outerValue的範圍。在Javascript中,您可以將函數任意嵌套在另一個函數中,並且閉包確保即使在外函數不在範圍內後調用內函數也可以看到外函數。

在java中,嵌套函數不是合法的,因此閉包甚至不起作用。有一個類字段代替outerValue和一個類方法來代替你的函數是不同的,因爲字段當然與類的範圍相關,而不是方法。

+0

非常感謝喬納斯。我已經爲我的問題添加了一個代碼示例。我看到outerValue仍然在範圍內!這在java中是不可能的! – balteo

1

想象一下,函數outerFn()是作爲回調函數傳遞的。某些時候,當它運行時,即使outerValue已經超出範圍,它仍然可以在關閉中訪問。

HTH

+0

感謝丹尼爾,但你怎麼知道「它已經超出了範圍」?它不會用另一種語言如java。會嗎? – balteo

+0

你能提供一個快速的代碼樣本嗎?我覺得很難想象你的意思。 – balteo

+0

你的意思是說,如果我將outerFn作爲另一個函數的參數傳遞,那麼outerValue在其他函數中仍然可見?如果是這樣的話,這確實很有趣... – balteo

2

將「clousures」理解爲能夠更改函數或方法的執行範圍。 下面是一個例子,我們通過修改'client1'的'May'和client2'John'的範圍來運行相同的功能。這在Java中是不可能的。

<html> 
<head> 
    <script type="text/javascript" src="jquery-1.5.2.min.js"></script> 
    <script type="text/javascript" > 

    function assert(condition, message) { 
     if (condition) { 
      alert(message); 
     } 
    } 

    function testClousures() { 
     var client1 = {name: 'Mary', code: 123}; 
     var client2 = {name: 'John', code: 234}; 

     function outerFn(){ 
      assert(this.name == 'John', "These come from the closure."); 
     } 

     // Testing if client is John 
     outerFn.apply(client1); // Fail 
     outerFn.apply(client2); // Success 

    } 

    function domReady() { 
     $('#btn').click(function(){ 
      testClousures(); 
     }); 
    } 
    </script> 
</head> 
<body onload="domReady()"> 
<br/> 
<input id="btn" type="button" value="Test"></input> 
</body> 
</hmtl> 
+0

-1這正是java中可能的。你不改變上下文,但是這和在不同對象的java中調用方法是一樣的。 –