2011-01-24 42 views

回答

2

它不起作用,因爲aaa不在fn()的範圍內。你可能會困惑的是,

(function() { 
    alert(aaa); // 'BBB' 
})(); 

正在工作,但fn()不是。發生了什麼事情是因爲「BBB」被定義爲foo2內部調用,alert(aaa)aaa在相同的範圍內,並且它工作得很好。

鑑於這種情況,你有兩個選擇:

  1. 聲明aaa在上部範圍:

    var aaa = 'BBB'; 
    
    var fn = function() { 
        return function() { 
        alert(aaa); 
        }; 
    }; 
    
    var foo2 = function() { 
        (function() { 
         alert(aaa); // 'BBB' 
        })(); 
        fn(); 
    }; 
    
  2. aaa作爲參數傳遞給fn()

    var fn = function (aaa) { 
        return function() { 
        alert(aaa); 
        }; 
    }; 
    
    var foo2 = function() { 
        var aaa = 'BBB'; 
        (function() { 
         alert(aaa); // 'BBB' 
        })(); 
        fn(aaa); 
    }; 
    

這裏有一個關於JavaScript的作用域的文章:

http://www.digital-web.com/articles/scope_in_javascript/

我希望這有助於。

+0

謝謝你的回覆。 :) – weilou 2011-01-24 11:05:31

3

我想在fn函數運行時,應該能夠在foo2函數中找到aaa。

不,不應該。 aaa作爲局部變量在foo2中聲明,因此在fn內部無法訪問。是什麼讓你覺得不對?我沒有看到任何編程語言會表現得如此。

它會工作,如果你取消註釋行//var aaa = 'AAA';,但然後fn內的警報當然會說「AAA」而不是「BBB」。

+0

謝謝您的回覆。 :) – weilou 2011-01-24 11:04:55

1

您在foo2內聲明var aaa,因此其範圍限制爲foo2fn無法訪問它。

要麼在兩個函數之外聲明var aaa,要麼將其作爲參數傳遞給fn

+0

謝謝你的回覆。 :) – weilou 2011-01-24 11:06:00