2012-01-07 22 views
1

私はもはやタイトル固有のものではありませんでした。JavaScriptスコープの問題、匿名関数内

私は、URLに使用されているクエリ文字列に応じて、ユーザーに異なるコンテンツを表示するWebサイト(個人用)を構築しています。

私の問題は、私はそれぞれにdir価値を付加しようとしているということです

(function(){ 
    var wrapper = { 
     init: function(){ 
      //Runs on document ready 
      this.foo(); 
      this.nav.render(); 
     }, 
     foo: function(){ 
      //Some functionality goes here for the website, e.g. Display something from an API 
     }, 
     nav: { 
      //Functionality to handle the navigation, has different properties 
      config: { 
       //Contains the config for nav, e.g. page names + locations 
       dir: '/directory/to/content/', 
       pages: { 
        page_name: wrapper.nav.config.dir + 'page_value' 
       } 
      }, 
      render: function(){ 
       //some code 
      }, 
      routes: function(){ 
       //some code} 
      } 
     } 
    }; 

    $(function(){ 
     wrapper.init(); 
    }); 
})(); 

page=home.htmlではJavaScriptが異なるデータを含む各値、いくつかの擬似コードで、オブジェクト内にラップされhome.html

のウェブサイトを表示していましたpageの値(ページが定義されているオブジェクトの内部)のうち、directory/to/content/page_valueの出力(この擬似コードの場合)を得ようとしますが、dirはアクセスしようとすると定義されません。私が欲しいものを達成するために次のように:

0123私はハードコーディングについて私が間違ってやっているのかを見つけることを試み、とさえ思った最後の30分で遊んでてきた
  • wrapper.nav.config.dir +「page_value」

各ページのURL。

私のローカル開発サーバーとWebホストは異なるディレクトリ構造を持っているため、開発したい+と公開するたびにURLを書き換えたくないという理由があります。なぜすべてがオブジェクトの中にラップされているかについては、この方法を維持する方が簡単だと思いました。

答えが簡単で、単なる素人間違い/理解不足です。

+2

コード 'wrapper.nav.config.dir +「page_value''のラインがありますか?上記の例ではありません。 – jfriend00

+0

これは私がdirプロパティにアクセスしようとしていて、成功しなかったものです。 – Daniel

+0

私はそれを使ってみたところで質問を編集しました。 – Daniel

答えて

2

問題は、その定義で定義されている変数を参照できないということです。

したがって、wrapperの定義内では、wrapperを参照することはできません。また、configの定義内では、configのように参照することはできません。

これを解決するための通常の設計パターンは、データ構造の宣言でできるだけ多く初期化し、残りの部分はすべて自由にアクセスできるときに.init()で行います。

+0

はい、単純にタイプミスです – Daniel

+0

OK、構文ミスについて知りたくないと思うなら(あなたの質問にはまだまだあります)、私は自分の答えを更新しました。 – jfriend00

+0

更新のためのおかげで、シンタックスミスのように、実際のソースではコンソールにエラーが表示されないので、意図したとおりに動作していると思います。 – Daniel

1

変更への最初の2行:

var wrapper = null; 
(function(){ 
    wrapper = { 

そうでない場合、ラッパーはあなたの匿名関数のローカル変数です。

+0

無名関数のすべてをラップする理由は、グローバル変数の定義が悪いと思っていたのですが、変更を加えても、まだ 'wrapper'は未定義です。 – Daniel

+0

これは問題とは関係ありません。 OPが匿名関数の外でラッパーにアクセスする必要がある場合、これは1つの解決策かもしれませんが、それは問題の一部ではありません。 – jfriend00

+0

@ jfriend00: "アクセスしようとしているときにdirが定義されていないのですが、私が望むことを達成するために次のように試しました。"これはリンクか何かでラッパーが使われているので、 – Krizz

1

問題は、依然としてラッパーがその値を求めているときに定義していることです。そのため、まだ定義されていません。

以下のコードはあまりにも失敗します。

var x = { 
    y:"1", 
    z:x.y 
} 
0

なぜ:

//... 
init: function(){ 
    //Runs on document ready 
    this.foo(); 
    var config = this.nav.config; 
    for (var page in config.pages) { 
     config.pages[page] = config.dir + config.pages[page]; 
    } 
}, 
//... 
関連する問題