2017-03-31 143 views
1

您可以將屬性分配給函數,但這是個好主意嗎? 在這個例子中,我表現出你不能創建屬性裏面的的功能,但你可以以外的它。將屬性添加到函數中

問:是否將一個可疑問題視爲JavaScript編程實踐?

function a() { 
 
a.bad = 1 
 
} 
 
a.questionable = 2 
 

 
function d() { 
 
    console.log(a.bad) 
 
    console.log(a.questionable) 
 
} 
 
d()

對此問題予以JavaScript: Understanding the Weird Parts

+0

它不應該是'this.bad = 1'呢?由於'a'在函數範圍 –

+1

^no中是未定義的,所以除非'a'是構造函數 – Damon

+1

在函數內部創建屬性同樣適用 - 您從來沒有調用過'a()'來運行它。在調用'd()'之前,將'a();'添加到您的代碼中,您將爲'a.bad'獲得'1'輸出。 – freginold

回答

3

在這個例子中,我顯示你不能創建一個屬性到函數中的函數,但你可以在它之外。

實際上並非如此。您可以在任何有引用的地方將屬性添加到函數中。問題是你沒有撥打a(),所以線路a.bad = 1從來沒有機會運行。

function a() { 
 
a.bad = 1 
 
} 
 
a.questionable = 2 
 

 
function d() { 
 
    console.log(a.bad) 
 
    console.log(a.questionable) 
 
} 
 
a() 
 
d()

問:a.questionable認爲是一個好的JavaScript編程實踐中?

jQuery非常廣泛地使用它(想想jQuery.fnjQuery.extend等)—所以不,我不認爲它本身被認爲是一種「不好」的編程習慣。事實上,在ES6將它們作爲class syntax的一部分引入之前,向構造函數添加屬性是模仿靜態字段和方法的唯一方法。

function Constructor() { 
 

 
} 
 
Constructor.staticMethod = function() { 
 
    return "I'm a static method!" 
 
} 
 

 
Constructor.staticProperty = "I'm a static property!" 
 

 
console.log(
 
    Constructor.staticMethod(), 
 
    Constructor.staticProperty 
 
)

+0

糟糕。對於那個很抱歉。 –

3

激發它的優良放在功能性。事實上,這正是ES6類的靜態方法,這是static的唯一用法;考慮明確的語言支持。

class Foo { 
    static bar() {} 
} 

'bar' in Foo // true 
typeof Foo // 'function' 

在這個例子中,我展示你不能創建一個屬性裏面的函數的函數,但是你可以在外面了。

您可以在該函數內的某個函數上創建一個屬性,但期望函數的主體在未調用的情況下運行是不合理的。

+0

糟糕。對於那個很抱歉。 –