最近 Javascript のテスト問題に遭遇しました。内容は次のとおりです:
コメント部分に Javascript コードを実装してみてください。他の場所に
コードを追加できます (実装できない場合は、実装できない理由を説明します):
var Obj = function(msg){
this.msg = msg;
this.shout = function(){
alter(this.msg) );
}
this.waitAndShout = function(){
// 5 秒後に上記のシャウト メソッドを実行します
}
}
var testObj = new Obj(" Hello, World!");
testObj.shout(); 正直、これまで Javascript クラスで setTimeout/setInterval を使用した経験がなかったので、最初は実現不可能だと思いました。しかし、慎重に検討した結果、それは実現できることがわかりました。一歩下がって、5 秒ごとに特定のステートメントを実行するのは非常に簡単です。たとえば、他の要素を考慮せずに、質問内の関数は次のように記述できます。
this.waitAndShout = function(){
setTimeout('this.shout()', 5000); 🎜>} 実行後、this 変数が見つからないことに誰もが気づくでしょう。しかし、これはなぜでしょうか? setTimeout/setInterval は実際には window オブジェクトのメソッドであることがすぐにわかります。そのため、上記の this.shout() は非常に理解しやすいです。実際には window.shout() を呼び出しているため、実行できません。
理由がわかれば、オブジェクトを window オブジェクトにバインドするだけで解決するのは非常に簡単です (Javascript の興味深いオブジェクトの仕組みに興奮しています)。次に、上記の関数に少し変更を加えます。
this.waitAndShout = function() {
window.Obj = this;
setTimeout('Obj.shout()', 5000) ;
} 以上です。実際、
setTimeout('Obj.shout()', 5000) は
window.setTimeout('window.Obj.shout()', 5000); と同等です。 、以前は、オブジェクトを配列として保存してから参照によって呼び出すことも考えていました。コードは次のとおりです。
function ObjectClass (property) {
this.property = property; .id = ObjectClass.cnt;
ObjectClass.objects[ObjectClass.cnt] = this;
this.method = ObjectClass_method;
ObjectClass.cnt = 0; .objects = new Array();
function ObjectClass_method () {
setTimeout('ObjectClass.objects[' this.id '].method();',
}
var obj1 = new ObjectClass('feelinglucky');
obj1.method(); ただし、個人的には、上記の最初のメソッドの方がはるかに明確であると感じます。
追記、JavaScript には特にオブジェクトの仕組みなど、注意が必要な部分が多いようです。前に述べたように、JavaScript は他の言語よりも複雑ではありませんが、思っているほど単純でもありません。
追伸: この質問を完了した後、Google は他の兄弟がこの種の問題をすでに解決していることを発見しました。たとえば、ここやここなどで、比較して参照することができます。
----------------------------------------------------- ---------------------------------------
兄さんのおかげで更新されましたSheneyan 念のために言っておきますが、Closure を使用してこれを実現する別の方法もあります。コードは次のとおりです。 = function() {
アラート(this.msg);
this.waitAndShout();
}
var _self =
this.waitAndShout;
setTimeout(function(){_self.shout()}, 5000);
}
}
var testObj("Hello, World!"); testObj.shout(); この質問はもう人々に害を及ぼすことはできないようです :^)