2017-03-31 12 views
1

プロパティに関数を割り当てることはできますが、それはいい考えですか? この例では、関数内にプロパティを作成することができないことを示していますが、内の関数はの外にあります。です。関数にプロパティを追加する

Q:疑問を解決するには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 'の代わりにすべきではありませんか?関数スコープ –

+1

^noで 'a'が定義されていないので、' a'がコンストラクタでない限りそうではありません。 – Damon

+1

関数内でプロパティを作成することもできます。 '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()

Q:a.questionableは大丈夫JavaScriptプログラミングプラクティスと考えていますか?

jQueryのは、それは非常に広範囲に&#x2014の(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

に触発されました。実際、それはちょうどstaticの唯一の使用であるES6クラスの静的メソッドとまったく同じです。明示的な言語サポートとみなしてください。この例では

class Foo { 
    static bar() {} 
} 

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

、私はあなたが関数内の関数にプロパティを作成することはできませんが、あなたはそれの外にすることができることを示しています。

この関数内の関数にプロパティを作成できますが、関数の本体が呼び出されずに実行されることは期待できません。この例では

+0

申し訳ありません。 –

関連する問題