0

私はJavaScriptの初心者です。
なぜこれが機能しないのか誰かに説明してもらえますか?そしてそれを機能させる方法は?

function getResults(keywords) {

        foo.foo = function() {
               var bar = foo.getSomeText; // Contain "blabla"
        };

        return bar;

    }

    // Globale scope


    alert(bar); // Do nothing

編集(情報不足で申し訳ありません):

これは、xhrリクエストからテキストを返したいので、関数を使用してonreadystatechangeイベントを使用する必要があるためです。元のコードは次のとおりです。

function getResults(keywords) {
     // Effectue une requête et récupère les résultats

    var xhr = new XMLHttpRequest();
    xhr.open('GET', './autoc.php?s='+ encodeURIComponent(keywords));

    xhr.onreadystatechange = function() {
        if (xhr.readyState == 4 && xhr.status == 200) {
           var response = xhr.responseText;
          var test = response.split('|');

        }



    };


    xhr.send(null);

    return test;

}



var hum = getResults('test');
console.log(hum);
4

4 に答える 4

1

これはうまくいくはずです

var bar;
var foo = {getSomeText : 'blabla'};

function getResults(keywords) {

    foo.foo = (function() {
        return bar = foo.getSomeText; // Contain "blabla"
    })();

    return bar;

}

// Globale scope
bar = getResults('hi');

alert(bar); // Do nothing​​​​​​​​​​​​​​​​​​

フィドル

  • バーが定義されていないため、構文エラーのために初期コードが機能しません。
  • fooはここではオブジェクトであり、それでも定義されていません。したがって、オブジェクトを作成する必要があります。
  • getResults関数を明示的に実行し、グローバルスコープの変数バーに割り当てる必要がある場合に関数内で再定義できるバーを返します。

アップデート

AJAXは非同期であり、コールバック関数で設定されている関数から値を返そうとしています。リクエストは非同期であるため、コールバック関数にヒットするまでに関数はすでに返されています。したがって、2番目のケースでは、テストは常に未定義になります

于 2012-11-13T17:51:24.353 に答える
1
foo.foo = function() {
    var bar = foo.getSomeText; // Contain "blabla"
};
return bar;

foo宣言されていないように見えるという事実を無視するbarと、関数内で宣言されます。JavaScriptには関数スコープがあるため、関数内にのみ存在します。その関数スコープの外ではアクセスできないため、returnここで実行しようとしているようにアクセスすることはできません。

return barその関数の外部で宣言された場合にのみ可能です。

var bar = foo.getSomeText; // Contain "blabla"
foo.foo = function() {

};
return bar;
于 2012-11-13T17:48:49.377 に答える
1

javascriptの変数のスコープは単純です。それはどちらかです:

  • 宣言されている関数
  • window関数で宣言されていない場合のグローバルスコープ(ブラウザー内)
于 2012-11-13T17:50:35.370 に答える
1

変数のスコープは、宣言されている場所によって異なります。スクリプトタグブロック内のメソッドではなく、スクリプトタグで直接宣言すると、グローバル変数になります。

ただし、「foo.foo」では最初の「foo」が未定義のエンティティであるため、コードサンプルで何をしようとしているのかは明確ではありません。あなたはこれを試すことができます:

<script type="text/javascript">
var foo = {}// creating empty global object named 'foo'

foo.foo = function()//defining method foo() on object foo
{
    var bar = "some random text";

//// more coding here

return bar;

}

var myBar = foo.foo();// get text from method. Note that the method call should be post method definition
alert(myBar);
</script>

Javascriptは簡単で楽しいです。いくつかの紹介テキストを読み、それを理解するためにコードサンプルを参照することをお勧めします。

于 2012-11-13T17:54:33.987 に答える