0

checkX()のスコープの何が問題なのか誰か説明してもらえますか? それが間違っていると私が疑っているのは、匿名関数が何らかの形でそれをブロックしていることですが、それをバイパスする方法がわかりません。

storage = chrome.storage;

function checkX(){
    var x = false;

    storage.sync.get(function(data){
        if(data.x == true){
                x = true;
                console.log(x); // << x : true
        }
    });

            console.log(x); // << x : false
    return x;
}

console.log の結果の順序:

x : false
x : true
4

2 に答える 2

1

あなたを投げるかもしれない、そしておそらく投げかける2つのこと:

  1. JavaScript は大文字と小文字を区別します
  2. getあなたが使用するメソッドは非同期あり、渡されたコールバック関数が実行される前にIIFEが返されるためx、コールバックが変更する前の値を返します。

編集:
メソッドgetは単なるゲッターですが、chrome.storage.sync.getGoogle同期を使用してデータを取得する と、オブジェクトchrome.storage.local.getを使用するのと(ほぼ)同じである の間に大きな違いがあり、イベントの利点が追加されています。localStorage少なくとも、それがGoogle のドキュメントが一目で私に言っていることですか?

以下のコメントから:
ここでの問題は、JS がコールバック関数を呼び出す方法とタイミングです。OP が使用するゲッターがローカルデータを取得している場合でも、シングル スレッドである JS がコールバックを呼び出す前に、IIFE が最初に戻る必要があります。そのため、IIFE が返されますfalse

于 2013-01-30T08:17:23.177 に答える
0

Javascript は大文字と小文字を区別します。あなたがしているのは、グローバル変数xを作成することですがtrue、ローカル変数Xは残りfalseます。

storage = chrome.storage;

function checkX(){
    var X = false;

    storage.sync.get(function(data){
        if(data.x == true){
            x = true;  <--- global variable
        }
    });

    return x;
}

別の問題はstorage.sync.get、「checkX」から非同期に実行される場合です。これは、最初に x を返し、後で (x を返した後に) 関数が実行されることを意味します。これは、storage.sync.get が ajax 呼び出しである場合に確実に発生します。

于 2013-01-30T08:17:04.713 に答える