1

如何访问命名空间中的对象。1)我有一个导入脚本文件的 html

一个脚本定义命名空间应用程序,另一个脚本将对象附加到它

我如何访问对象并开始使用它

应用程序.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();
});

个人.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);

我的html.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”以便我可以使用它的方法。访问 hte 对象时出现未定义的错误。我无法按照上面写的方式访问对象

4

4 回答 4

0

如果您在函数中定义变量,则该变量在函数外部不可见,例如

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

// foo is not visible here

唯一随处可见的变量是全局变量(或者更准确地说,全局对象的属性,在浏览器的情况下是window)。这些可以通过三种方式定义:

  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

您不能只引用在这样的另一个范围内声明的变量。这就是存在范围的原因。如果要获取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 回答
0

有问题app.jsapp变量不是你想的那样:

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

分配给app的是等号后自执行匿名函数的返回值。这是未定义的(或者null,如果 jQuery 是假的)。您必须让函数返回要分配给appvar 的内容。

于 2012-09-06T18:32:15.360 回答