1

名前空間内のオブジェクトにアクセスする方法。1)スクリプトファイルをインポートするhtmlがあります

1つのスクリプトはnamesapceアプリを定義し、もう1つのスクリプトはそれにオブジェクトを添付します

オブジェクトにアクセスして使用を開始するにはどうすればよいですか

app.js

var app = (function(jQuery){
    if (!jQuery) {
        alert(app.resources["MISSING_LIB"]);
        return null;
    }

    return {
        init: function() {
            //code for init the app related variables and subnamspaces
        }
    };
})(jQuery);

jQuery(document).ready(function(){
    app.init();
});

personal.js

function(app){
    if (app) {
        app.Cache = function(nativeStorage,serializer ) {
            this.storage = nativeStorage;
            this.serializer = serializer;
        }

        app.Cache.prototype = {
            setItem: function( key, value ){
                this.storage.setItem(key, this.serializer.stringify( value ));
                return( this );
            }
        };

        var personalcontentstorage = new app.Cache(localStorage,JSON);
    } else {
        alert("app is undefined!");
    }
})(app);

myhtml.html

<html>
<head>
<script src="${ '/js/app.js'" type="text/javascript"></script>
<script src="${ '/js/personal.js'" type="text/javascript"></script>
</head>
<body>

    <h1>
        Exploring HTML5's localStorage
    </h1>

    <script type="text/javascript">
        jQuery(document).ready(function(){
            personalcontentstorage.setItem("mykey","myValue") ;
        });
    </script>
</body>
</html>

オブジェクト「personalcontentstorage」にアクセスしてそのメソッドを使用できるようにする方法。オブジェクトにアクセスすると未定義のエラーが発生します。上記の方法でオブジェクトにアクセスできません。

4

4 に答える 4

0

関数内で変数を定義した場合、その変数は関数の外では見えません。

(function () {
    var foo;
}());

// foo is not visible here

どこでも見える唯一の変数は、グローバル変数(より正確には、ブラウザーの場合は であるグローバル オブジェクトのプロパティwindow) です。これらは、次の 3 つの方法で定義できます。

  1. を使用しますvarが、関数内では使用しません:

    var foo;
    
    (function () {
        // foo is visible here
    }());
    
    // foo is also visible here
    
  2. window変数をオブジェクトに明示的にアタッチします。

    (function () {
        window.foo = 7;
    }());
    
    // foo is visible here
    
  3. var変数に何かを初めて割り当てるときは使用しないでください。これは間違いなく間違った方法です。コードを読んでいる人には、グローバル変数を作成するつもりだったことがわかりません。

グローバル変数には、さまざまなリスクと欠点があります。ページにサードパーティのスクリプトを含めると、同じグローバル変数名が使用され、独自のスクリプトに干渉する可能性があります。一般に、使用するグローバル変数の数を最小限に抑えることが最善です。

私はしばしばこのパターンを使用し、単一のグローバル変数を作成して、プロジェクトのすべてのコードを含めます (プロジェクトMySiteの名前に置き換えることができます)。

// Create a global variable that can contain everything else
window.MySite = {};

// Add something to the namespace
MySite.foo = (function () {
    // Code that isn't visible globally here

    return someValueForFoo;
}());

// Elsewhere in my code I can easily access `someValueForFoo`:
MySite.foo

これをプロジェクトに適用する:

window.MySite = {};

// In app.js
MySite.App = (function (jQuery) {
    // ...
}(jQuery));

// In personal.js
MySite.storage = (function (jQuery) {
    // ...
    return new MySite.App.Cache(localStorage,JSON);
}(jQuery));

// Elsewhere in your code
MySite.storage.setItem('foo', 'bar');
于 2012-09-06T18:46:05.193 に答える
0

に問題がありapp.jsますapp。変数はあなたが考えているものではありません:

var app = (function(jQuery){
    // function body
})(jQuery);

割り当てられてappいるのは、等号の後の自己実行無名関数からの戻り値です。これは未定義です(またはnull、jQueryが偽の場合)。app関数がvarに割り当てられる何かを返すようにする必要があります。

于 2012-09-06T18:32:15.360 に答える
0

そのような別のスコープで宣言された変数を参照することはできません。それがスコープが存在する理由です。変数を取得したい場合はpersonalcontentstorage、それを返すだけです:

// assign your IIFE to a variable
var something = (function(app){
    if (app) {
        // snip
        return new app.Cache(localStorage,JSON);
    } else {
        alert("app is undefined!");
    }
})(app);

jQuery(document).ready(function() {
    // use the variable your IIFE's return was stored in
    something.setItem("mykey","myValue") ;
});
于 2012-09-06T18:36:48.887 に答える
0

personal.js 関数から返すのはどうですか?

var Personal = (function(app) {
    if (app) {
        app.Cache = function(nativeStorage, serializer) {
            this.storage = nativeStorage;
            this.serializer = serializer;
        }

        app.Cache.prototype = {
            setItem: function(key, value) {
                this.storage.setItem(key, this.serializer.stringify(value));
                return (this);
            }
        };

        var personalcontentstorage = new app.Cache(localStorage, JSON);
    } else {
        alert("app is undefined!");
    }

    return {
        storage: personalcontentstorage
    };
}(app));

次に、HTML ファイルで次のように参照します。

Personal.storage.setItem("myKey", "myValue");

それがまさにあなたが探しているものかどうかはわかりません。あなたのコードは非常に読みにくく、あなた自身が認めるように、実際にはあなたのコードではなく、そのようなものです。よく構造化された、ある程度機能的なコードで質問を投稿してください。:-) </p>

于 2012-09-06T18:37:38.873 に答える