2016-06-17 8 views
0

xとyの2つのセットを比較できるように、何かのx、yを与える2つの関数を作成したいと思います。以下はその機能の1つです。 2つ目は同じことをするでしょう。関数外のvarにはどのようにアクセスすればよいですか?

私はconsole.log position.gxとposition.gyを関数の中に入れることができますが、関数の外でそれをアクセスするにはどうすればposition.gxとposition.hxを比較するかのようにすることができますか?

私はそれが範囲の問題だと知っていますが、私はこれを書き直す方法を理解することができないので、私はposition.gxと別の機能のものを比較できます。

(独学であることに問題が私は愚かなものにハングアップを取得される。)

function guyLocation() { 

var myElement = document.querySelector("#guy"); 
var xPosition = 0; 
var yPosition = 0; 

    function getPosition(el) { 
     this.addEventListener("load", true); 

     while (el) { 
     if (el.tagName == "BODY") { 

      var xScrollPos = el.scrollLeft || document.documentElement.scrollLeft; 
      var yScrollPos = el.scrollTop || document.documentElement.scrollTop; 

      xPosition += (el.offsetLeft - xScrollPos + el.clientLeft); 
      yPosition += (el.offsetTop - yScrollPos + el.clientTop); 
     } else { 
      xPosition += (el.offsetLeft - el.scrollLeft + el.clientLeft); 
      yPosition += (el.offsetTop - el.scrollTop + el.clientTop); 
     } 

     el = el.offsetParent; 
     } 
     return { 
     gx: xPosition, 
     gy: yPosition 
     }; 
    }; 

    document.body.onkeydown = function() { 
     position = getPosition(myElement); 
     console.log(position.gx + ", " + position.gy); 
    }; 
}; 
+0

短い答え - 彼らは「グローバル」を作るために、任意の関数の外で変数を宣言します。この変数は関数内でも利用可能でもあります。 –

+0

あなたの問題を既に解決したようです。コード内の 'position'は[暗黙的なグローバル]です(http://blog.niftysnippets。org/2008/03/horror-of-implicit-globals.html)(悪い習慣)、どこにでもアクセスできます。あなたはグローバルスコープで 'position'を宣言することができます。 – Teemu

+0

[Closures](https://developer.mozilla.org/en/docs/Web/JavaScript/Closures)を見てください。これはあなたが探しているものです。 – DavidDomain

答えて

1

あなたは、関数をエクスポートし、それのいくつかのプロパティを設定することができます。 (これは少しファンキーですが、それが何をしているか/どのようにあなたが表示されるはずです):

NOTE(変更のため、このコードの最後の数行を参照)

この単純なマークアップ:

<div id="guy"> 
    Howdy 
</div> 

このコード:

function guyLocation() { 
    var myElement = document.querySelector("#guy"); 

    var xPosition = 0; 
    var yPosition = 0; 

    function getPosition(el) { 
    // this.addEventListener("load", true); 

    while (el) { 
     if (el.tagName == "BODY") { 

     var xScrollPos = el.scrollLeft || document.documentElement.scrollLeft; 
     var yScrollPos = el.scrollTop || document.documentElement.scrollTop; 

     xPosition += (el.offsetLeft - xScrollPos + el.clientLeft); 
     yPosition += (el.offsetTop - yScrollPos + el.clientTop); 
     } else { 
     xPosition += (el.offsetLeft - el.scrollLeft + el.clientLeft); 
     yPosition += (el.offsetTop - el.scrollTop + el.clientTop); 
     } 

     el = el.offsetParent; 
    } 
    return { 
     gx: xPosition, 
     gy: yPosition 
    }; 
    }; 

    document.body.onkeydown = function() { 
    guyLocation.position = getPosition(myElement); 
    console.log(guyLocation.position.gx + ", " + guyLocation.position.gy); 
    }; 
    guyLocation.getPosition = getPosition;// allows outside calls 
}; 

guyLocation();// sets stuff up, exports function 
console.log(guyLocation.position);// undefined 
// sets value 
guyLocation.position = guyLocation.getPosition(document.querySelector("#guy")); 
console.log(guyLocation.position);// Object {gx: 8, gy: 8} 
0

私はここで問題がないと思うの外(窓スコープで変数を宣言任意のコード本体がどこにでもアクセスできます)。デザイナーのソリューションとしてクラス(プロトタイプ)をチェックアウトし、オブジェクトの位置を追跡して更新するエンジンオブジェクトを作成し、このエンジンをウィンドウスコープに格納し、どこからでもクエリを実行できます。タイマーで更新ループを作成し、エンジンオブジェクトにスプライトを格納し、そのデータのすべての更新とクエリを管理する、より洗練されたゲームエンジンを作成するという基盤があります。

+0

あなたは何が起こっているのか、私はクラスを見ていきますが、自分のものを書き直してどのように変数を現在のスコープの外に出すことができるのでしょうかと思います。私はvar gxを関数の外に置こうとしましたが、定義されていません。 – NJeffries

+0

上のguyLocation、 'var position'を置くと、(スコープの不明瞭さが発生していない限り)ポジションに割り当てるたびにグローバル変数位置に移動します – kirinthos

1

あなたが本当にやりたいことは、あなたの問題を解決するためのやや異なるアプローチをとることだと思います。

動きを処理するコードブロックであるmoduleを作成した場合、他の場所で使用する必要がある内部メソッドが公開されます。ここで

は、ビデオは種類のあなたがステップバイステップに取得する方法を歩くシリーズの1つです

を助けるかもしれないいくつかのリンクありモジュールパターンを明らかにする。

最初は奇妙なことになりますが、JavaScriptで非常によく使われていて非常に強力なので、学習する価値があります。

0
は...関数呼び出し外のKeyDownイベントリスナーを移動

function guyLocation() { 

    var myElement = document.querySelector("#guy"); 
    var xPosition = 0; 
    var yPosition = 0; 

    // return the parts you want to expose outside the function scope... 
    return { 
     getPosition: getPosition 
    }; 

    function getPosition(el) { 
     this.addEventListener("load", true); 

     while (el) { 
      if (el.tagName == "BODY") { 

       var xScrollPos = el.scrollLeft || document.documentElement.scrollLeft; 
       var yScrollPos = el.scrollTop || document.documentElement.scrollTop; 

       xPosition += (el.offsetLeft - xScrollPos + el.clientLeft); 
       yPosition += (el.offsetTop - yScrollPos + el.clientTop); 
      } else { 
       xPosition += (el.offsetLeft - el.scrollLeft + el.clientLeft); 
       yPosition += (el.offsetTop - el.scrollTop + el.clientTop); 
      } 

      el = el.offsetParent; 
     } 
     return { 
      gx: xPosition, 
      gy: yPosition 
     }; 
    } 

} 

function dollLocation() { 

    // return the parts you want to expose outside the function scope... 
    return { 
     getPosition: getPosition 
    }; 

    function getPosition(el) { 
     // more logic here... 
    } 

} 

// put this part outside the `guyLocation` function 
document.body.onkeydown = function() { 
    // access different functions, and compare in here... 
    guyPosition = getPosition(myElement); 
    dollPosition = getPosition(myElement); 
    console.log(guyPosition.gx + ", " + guyPosition.gy); 
    console.log(dollPosition.gx + ", " + dollPosition.gy); 
}; 
関連する問題