2017-12-21 13 views
0

私はJSを初めて使用しています。私は(Person)Person()を変更した場合、私はPerson.onが関数を実行したときにPerson.onが機能しない理由

TypeError: Person.on is not a function 

を取得し、なぜ私はそれが動作しますが、Person()機能を機能していない、大丈夫だろうか?私がかっこで書くとき、それはパラメータではありませんか?あなたは私が学ぶのを助けることができますか?

var events = require("events"); 
var util = require("util"); 

var Person = function (name) { 
    this.name = name 
} 

util.inherits(Person, events.EventEmitter) 

var name1 = new Person("Jack") 
var People = [name1] 

People.forEach(function Person(){ 
    Person.on('key',function(msg){ 
     console.log(Person.name + ' said this ' + msg); 
    }); 
}); 

name1.emit("key","okey") 
+0

あなたはコールバック関数として 'Person'を再宣言しました。 'function Person()'の代わりに、おそらく 'function(Person)'がほしいと思います。それでも、私はおそらくそれらをコンストラクタとインスタンスを区別するために '人物 'に変更するでしょう。 – user184994

+0

node.jsタグがありますか? – RobG

+0

はい、 'Person(){'のトークン "Person"は関数の名前であり、パラメータではありません。 – Bergi

答えて

0

問題は、コードのこの部分である:

ここ
People.forEach(function Person(){ 
    Person.on('key',function(msg){ 
     console.log(Person.name + ' said this ' + msg); 
    }); 
}); 

.forEachはあなたがコレクションを反復処理するために使用できるコールバック関数を、期待しています。このコールバック関数は、いくつかのパラメータを受け取ります。このうち、最初のパラメータは、繰り返しが実行されている現在のアイテムを示します。だから、あなたは次のようにコードを変更する必要があります:関数のパラメータとなり、personは(@Bergiからのコメントどおり、改称)

People.forEach(function(person) { 
    person.on('key',function(msg){ 
     console.log(person.name + ' said this ' + msg); 
    }); 
}); 

を今すぐ代わりにコールバック関数に名前を与えるのは、その最初の引数を受け取るので、繰り返しの現在の項目を指します。

これがあなたのジレンマを解決することを願っています。 .forEach機能の詳細については、MDN documentationを参照してください。

+1

また、 'Person'コンストラクタと区別できるように、コールバックパラメータに' Person'よりも優れた名前を使用してください。 「人間」はその不一致に対しては罰金かもしれない。 – Bergi

+0

@Bergi - ええ!それは理にかなっている。 – 31piy

関連する問題