0

私には奇妙な状況があります。つい最近、以前の質問により、一部のコードを手続き型からオブジェクト ベースに変更しようとしました。

関数内で関数を呼び出すコード内のいくつかの場所があります (すみません、私はまだ Javascript の用語を学んでいます)。

親「this」との接続を維持しようとして、次のように関数呼び出しに「thisObj = this」を追加して、変数を関数に渡そうとしました

geoLoc: function () {
    "use strict";
    var thisObj;
    if (navigator.geolocation !== undefined) {
        navigator.geolocation.getCurrentPosition(function (position) {
            thisObj.calcRoute('driving', position.coords.latitude + ', ' + position.coords.longitude, true);
        }, thisObj = this);
    }
},

それで、これはFFで機能したので、大丈夫だと思いました。jslint で確認したところ、すべてが緑色 (または黄色/青色) になり、エラーは表示されませんでした。

ただし、Chrome は「ミスマッチ dom 例外 17」があると判断し、ジオロケーションを使用しないことにしました。

偶然にも、その定義を次のように移動してみました

geoLoc: function () {
    "use strict";
    var thisObj;
    if (navigator.geolocation !== undefined) {
        navigator.geolocation.getCurrentPosition(function (position) {
            thisObj.calcRoute('driving', position.coords.latitude + ', ' + position.coords.longitude, true);
        }), thisObj = this;
    }
},

驚いたことに、FF と Chrome の両方で動作しました。残念ながら、それはjslintに失敗し、IEはかかとを蹴って死にました。

さて、私の質問は、そもそもFFで実行してjslintを渡すために実際に何をしたのか、そしてその2番目の関数内で実際にオブジェクトに名前を付けることに頼らずに状況を修正するにはどうすればよいかということです。それへの参照。

jquery は使用しないでください。ストレートなジャバスクリプト。それを修正するコードよりも重要なのは、私が実際に何をしたかについての説明です...できれば素人の言葉でお願いします。それで、さらに調査できます。

4

1 に答える 1

1

Javascriptでは、関数はその「上」の関数で宣言された変数にアクセスできるため、変数をあちこちに渡す必要はありません。したがって、現在のオブジェクトへの参照を(例として)thisという名前の変数に保持できます。that

geoLoc: function () {
    "use strict";
    var that = this;
    if (navigator.geolocation !== undefined) {
        navigator.geolocation.getCurrentPosition(function (position) {
            that.calcRoute('driving', position.coords.latitude + ', ' + position.coords.longitude, true);
        }/* if you try to "add" something there, it comes as a 2nd argument for getCurrentPosition*/);
    }
},

また、内部関数には外部関数のスコープが「含まれている」と言うこともできます。これは、Javascriptに非常に固有であり、その設計とそれを使用したアプリケーションの設計において非常に興味深いものです。詳細については、JSで「関数スコープ」と「クロージャ」を探してください。

編集:の2番目のパラメーターはnavigator.geolocation.getCurrentPositionエラーコールバック、つまり関数であると予想され、, thisObj = thisそこに配置しようとしました。これにより、ブラウザーの障害が発生する可能性があります。または、実行時に、成功コールバック(の最初のパラメーター)が呼び出される前に実際に割り当てthisられます。したがって、他のブラウザでの一種の「作業」です。とにかくこれは不安定なので避けるべきです。 thisObjgetCurrentPosition

関数を変数として使用したり、他の関数のパラメーター(「コールバック」とは何か)を使用したりするなど、JSの基本的な構文機能から始める必要があると思います。これが主な概念です。コードの一部をランダムに移動しようとする代わりに(私の意見)。

于 2013-03-12T23:10:02.190 に答える