2010-12-18 61 views
0

例如:嵌入功能問題

//global vars 
var g1,g2,g3; 
function a(p1,p2,p3){ 
    //local vars 
    var a1,a2,a3; 
    return function(){ 
    //an embed function, looks like dynamic defined at runtime 
    } 
} 

var f1 = a(1,2,3) 
var f2 = a(4,5,6) 
f1() 
f2() 

我的問題是,是F1和F2指向內存中相同的代碼,所以才接縫不同勢函數?每次打電話時是否花費時間創建嵌入功能?在執行完GC之後,GC的返回嵌入函數必須是GC,返回的嵌入函數的原因仍然可以調用函數a的局部變量。

回答

0

如上所述,嵌入式函數可以訪問局部變量。這被稱爲closure

1

回答您的問題:

  1. 沒有它們指向不同的功能
  2. 當然這需要一點時間來創建新的功能
  3. 這是因爲返回的功能是關閉和尚可參考它們的創建範圍。

函數聲明和表達式的區別

function foo() {} // created at compile time, is available every in the code from the start 

var foo = function() {}; // created at runtime, only is available after it's creation 
         // while foo already exists it's set to undefined 

function test() { 
    return function(){}; // returns a new function each time test is called 
} 

瓶蓋

function test() { 
    var b = 123; 

    // this function inherits all outer scopes so it still has access to b 
    return function() { 
     console.log(b); // 
    }; 
} 

更多關於關閉看到這個question和答案。

+0

JavaScript中沒有編譯。函數聲明也在運行時進行評估。區別在於它們在當前執行上下文中的任何其他語句之前被評估。 – 2010-12-18 17:34:52

+0

@Sime沒有在javascript中編譯,合理,但如何解釋f1和f2是不同的功能。 – 2010-12-18 17:53:21

+0

@Sime yea,大多數情況下我稱之爲編譯時; @guilin因爲'function()'表達式在每次調用時都會創建一個新函數。 – 2010-12-18 17:58:40

1

我的問題是,是f1和f2指向內存中的相同代碼,爲什麼它們會接受不同的函數?

它們不指向相同的功能。

確實有花費時間來創建嵌入函數,每次都是一次調用?

是的,每次調用a函數時,都會創建並返回一個新的內部函數。

和GC的工作原理也很intresting,一個本地變量不會被GC一個執行後,它必須是GC返回嵌入功能後GCed,返回嵌入功能的原因仍然可以調用的函數的本地變量。

是的,這就是所謂的封閉。內部函數可以訪問創建它的執行環境的所有變量。