2010-05-12 53 views
3

我想我有這個想法,但我希望cleary有這個解釋 - 究竟是這兩個JavaScript片段之間的區別是什麼?這兩個不同的JavaScript聲明的目的是什麼?

;Person1 = (function() { 
    var FirstName = 'Hello'; 
    var LastName = 'World'; 
    this.sayHello = function() { 
    alert(FirstName + ' ' + LastName); 
    }; 
}); 

;Person2 = (function() { 
    var FirstName = 'Hello'; 
    var LastName = 'World'; 
    this.sayHello = function() { 
    alert(FirstName + ' ' + LastName); 
    }; 
})(); 

一個正在執行的();最後,另一個不是。當我做新的Person1(),sayHello()或新的Person2()。sayHello(); - 他們留下了什麼?根據我的理解,後者是一個在瀏覽器被執行時執行的閉包,但我還沒有完全理解它的含義。謝謝你的幫助!

更新:我錯誤地省略Person2閉包中的return關鍵字。然而,我沒有解決這個問題,因爲這些答案對描述這樣做的含義非常有幫助:)

回答

0

Person1是一個相當標準的對象構造函數類型,用於調用newnew Person1()創建一個新對象,並在該對象上創建一個sayHello方法。

Person2正在執行,這是造成一些問題!當正在評估Person2時,函數被調用(在全局上下文中)。在該函數的執行中,this將是window對象。執行功能不返回任何東西,所以Person2最終被未定義:

>>> Person2 = (function() { var FirstName = 'Hello' // ...}; })(); 
>>> console.log(window.sayHello, Person2); 
function() undefined 

一個new Person2()是導致TypeError「PERSON2不是構造函數」對我來說。如果更改此了一點,就可以使Person2關閉返回一個對象與功能:

;Person2 = (function() { 
    var FirstName = 'Hello'; 
    var LastName = 'World'; 
    return { 
    sayHello: function() { 
     alert(FirstName + ' ' + LastName); 
    } 
    }; 
})(); 

Person2.sayHello(); 

或使其恢復功能(所以你可以new Person2()):

;Person2 = (function() { 
    var FirstName = 'Hello'; 
    var LastName = 'World'; 
    return function() { 
    this.sayHello = function() { 
     alert(FirstName + ' ' + LastName); 
    }; 
    }; 
})(); 
+0

非常感謝你的體貼的解釋 - 我錯誤地離開了我在創作的迴歸Person2關閉。不過,我很高興我這麼做了,因爲你的迴應讓我想起了這樣做的'全球'含義。 – TimDog 2010-05-12 15:02:05

0

第一一個內聯函數定義一個函數並且Person1持有一個對它的引用。

第二個等於不採取任何行動。你正在內聯定義一個函數並立即執行它。由於該函數不返回任何東西,因此Person2未定義。

這兩個例子的行爲都不如你描述的那樣,所以你可能會錯誤地輸入你的例子?

+0

'Person2'可能是未定義的,但它也設置'this.sayHello',它將在'window'對象上創建'sayHello'。 – gnarf 2010-05-12 14:50:18

+0

我的不好 - 你是對的,我的人有一個錯字3。我現在編輯它。謝謝。 – TimDog 2010-05-12 14:54:18