2016-09-07 9 views
0

私はすでにstackoverflowのどこでも見てきましたが、これに対する回答は見つかりませんでした。Javascript closure(this)

キャッチされない例外TypeError:this.rsGameは(this.addEnemyほぼ同じ)関数ではありません

let game = new Phaser.Game(600,600); 
let speed = 500; 


let scyla = { 

    preload:() => { 
     game.load.image('bg', 'assets/bg.png'); 
     game.load.image('pl', 'assets/pl.png'); 
     game.load.image('enemy', 'assets/enemy.png'); 

    }, 
    create:() => { 

     game.physics.startSystem(Phaser.Physics.ARCADE) 

     game.add.sprite(0,0, 'bg'); 

     this.player = game.add.sprite(300, 500, 'pl'); 
     this.player.anchor.set(0.5); 

     game.physics.arcade.enable(this.player); 
     this.cursors = game.input.keyboard.createCursorKeys(); 

     this.enemies = game.add.group(); 

     // this.timer = game.time.events.loop(200, this.addEnemy(), this); 
    }, 
    update:() => { 

     this.player.body.velocity.x = 0; 
     this.player.body.velocity.y = 0; 

     if (this.cursors.left.isDown) 
      this.player.body.velocity.x = speed * -1; 

     if (this.cursors.right.isDown) 
      this.player.body.velocity.x = speed; 

     if (this.cursors.up.isDown) 
      this.player.body.velocity.y = speed * -1; 

     if (this.cursors.down.isDown) 
      this.player.body.velocity.y = speed; 

     if (this.player.inWorld === false) 
      this.rsGame(); 
    }, 
    rsGame:() => { 
     game.state.start('scyla'); 

    }, 
    addEnemy:() => { 
     let enemy = game.add.sprite(300, 100, 'enemy'); 
     game.physics.arcade.enable(enemy); 
     enemy.body.gravity.y = 200; 

     this.enemies.add(enemy); 
     enemy.checkWorldBounds = true; 
     enemy.outOfBoundsKill = true; 
    } 
} 

game.state.add('scyla', scyla); 
game.state.start('scyla'); 

私は、これは窓がとにかくオブジェクトを返す

let self = this 

のようなものを試してみました。これは、クロージャとは何かを持っていますが、私は正確に

は、この問題を解決する方法がわからない理解していない:/

答えて

1

アロー機能は字句スコープにthisを設定します。 scylaオブジェクトにアクセスしようとしていますが、矢印機能はwindow(またはscylaと宣言したときのthisと等しい)に設定しています。

直接参照scyla

scyla.rsGame(); 

または標準関数式使用してメソッドを記述:の値を保持

update() { 
    ... 
    if (this.player.inWorld === false) 
     this.rsGame(); 
} 
+1

または簡潔なメソッド宣言: 'update(){' – Bergi

0

矢印機能:

update: function() { 
    ... 
    if (this.player.inWorld === false) 
     this.rsGame(); 
} 

または速記方法宣言をthis宣言された。

正規表現を使用します。このために矢印関数を使用しないでください。

preload: function preload() { 
    // etc 
} 
0

矢印機能の語彙スコープはthisです。通常の関数を使用して、thisがいつものようにバインドされるようにする必要があります。変更:

update: function () { 

と同様scylaの他の特性のために:

update:() => { 

へ。