3

我有一个关于在 jQuery 中访问变量的简单问题。当我在单击“a”时调用读取函数时,是否有办法访问变量(换行)。

(function() {
    var Example= {
        init: function() {
            var wrap = 'hello world';
            $('a').on('click', this.read);
        },

        read: function() {
            console.log(wrap)
        }
    };

    Example.init();
})();
4

6 回答 6

3

有几种方法可以做到这一点。也许最简单的方法是更改​​“wrap”变量的范围。目前,由于它是在init函数内部使用 var 声明的,因此它的作用域仅限于init函数并且不能init直接在外部使用。因此,您可以在外部声明“包装” init(它可能是“示例”对象的属性):

    var Example= {
        wrap: 'hello world',
        init: function() {
            var self = this;
            $('a').click(function(){
                self.read();
            });
        },

        read: function() {
            console.log(this.wrap);
        }
    };

    ​Exa​mple.init();

这使得 'wrap' 的范围为 'Example',并且在 'Example' 中定义的任何函数中都可作为 'Example' 的属性使用。

(编辑:必须稍微调整一下才能正确处理关闭。)

于 2012-04-14T01:03:06.933 回答
3
(function() {
    var wrap;
    var Example= {
        init: function() {
            wrap = 'hello world';
            $('a').on('click', this.read);
    ...

因为函数可以访问在其定义范围内可见的所有变量。

于 2012-04-14T00:59:03.173 回答
0
(function() {
    var Example= {
        init: function() {
            this.wrap = 'hello world';
            $('a').on('click', this.read);
        },
        read: function() {
            console.log(this.wrap)
        }
    };
    Example.init();
})();
于 2012-04-14T01:06:37.930 回答
0

试试这个:(小提琴:http: //jsfiddle.net/jRJFQ/3/

(function(){
    var Example= {
        wrap:null,
         init: function() {
            this.wrap = 'hello world';
            $('a').on('click', this.read);
         },

        read: function() {
            console.log(Example.wrap)
        }
    };
    Example.init();
}​)();​
于 2012-04-14T01:08:23.963 回答
0

如果您考虑使用显示模块模式,您可以定义哪些变量是私有的,哪些是公共的,如下所示:

var Example = (function(){

    var wrap = 'hello world',
        init = function(){
            ...
        },
        read = function(){
            ... // You can use `wrap` here
        };

    return { // Return public variables and methods
        init: init,
        read: read
    };

})();

Example.init();
于 2012-04-14T01:11:06.227 回答
-1

是的,这应该这样做:

(function() {
    var wrap;
    var Example= {
        init: function() {
            var wrap = 'hello world';
            $('a').on('click', this.read);
        },

        read: function() {
            console.log(wrap)
        }
    };

    Example.init();
})();
于 2012-04-14T00:59:05.843 回答