2011-03-22 96 views
7

我看到很多,該函數返回不是結果,但函數。 下面的例子顯示功能getWindow返回函數。爲什麼它不能只是返回變量「贏」?當我返回結果和何時功能? 謝謝。當函數返回結果,並在JavaScript中的函數

var A = function(){}; 
A.prototype= 
{ 
    getWindow : function() 
    { 
     var win = new B.window(); 
     return (
       this.getWindow = function() 
       { 
        return win; 
       })(); 

    } 
} 

回答

4

這個代碼就相當於你的代碼,但更容易理解:

A.prototype = { 
    getWindow: function() { 

     var win = new B.window(); 

     this.getWindow = function() { 
      return win; 
     }; 

     return win; 

    } 
} 

用法:

首先,創建一個實例:

var a = new A(); 

然後,呼getWindow

a.getWindow(); 

這裏,調用A.prototypegetWindow方法。正如你可以在我的上面代碼中看到,A.prototype.getWindow將創建一個new B.window()回報它,但是在兩者之間,它也將創建實例對象本身在getWindow方法

現在,如果你再打電話getWindow

a.getWindow(); 

A.prototype.getWindow不再稱爲因爲實例對象本身具有getWindow方法。此方法返回第一次調用getWindow方法時返回的相同「win」對象。


你的模式允許多個A實例使用相同的方法A.prototype.getWindow實例化自己的「雙贏」目標。試想一下:

var a1 = new A, 
    a2 = new A, 
    a3 = new A; 

a1.getWindow(); // creates window W1 and returns it 
a2.getWindow(); // creates window W2 and returns it 

a1.getWindow(); // returns window W1 
a2.getWindow(); // returns window W2 

a3.getWindow(); // creates window W3 and returns it 

a1.getWindow(); // returns window W1 
a2.getWindow(); // returns window W2 
a3.getWindow(); // returns window W3 

這是一個非常有用的模式:)


更新:

這是你的代碼:

return (this.getWindow = function() { 
    return win; 
})(); 

首先,讓我們來看看在parens裏面的表達式:

this.getWindow = function() { return win; } 

正如你所看到的,這是一個賦值表達式。一個匿名函數對象被分配給由this(實例對象)引用的對象的getWindow屬性。

請注意,此函數返回win對象。

該賦值表達式的結果是函數對象本身!這意味着parens中的值是函數對象。

現在,讓我們來看看全貌:

return (the_function_object)(); 

我們可以去掉括號,因爲我們不需要他們了:

return the_function_object(); 

正如你所看到的,在功能對象被調用,並且然後返回該函數的返回值。

如上所述,該函數返回win。因此,代碼解析到此:

return win; 

那麼你的代碼的作用是:

首先,它分配給function() { return win; }this.getWindow

第二,它返回調用該函數的結果是win

我的代碼產生相同的結果,但更容易理解:

this.getWindow = function() { 
    return win; 
}; 

return win; 
+0

所以,如果我理解正確的話,對A型「直接」功能將覆蓋具有相同的名稱前面的函數原型? – pimvdb 2011-03-22 21:02:56

+1

@pimvdb否 - 將'getWindow'方法添加到實例對象本身(在上面的代碼中爲'a')。 'A.prototype.getWindow'方法沒有被修改。然而,'a.getWindow'現在** **''.prototype.getWindow'方法,所以這個原型方法變得實例對象'a'無法訪問。 – 2011-03-22 21:05:44

+0

爲什麼我需要'()'在'返回'結束? – theateist 2011-03-24 13:50:51