访问匿名函数中的对象实例变量范围

时间:2013-10-11 11:43:03

标签: jquery jquery-plugins

我不知道如何访问插件'选项'对于fadeOut完成后匿名函数中的这个特定实例。

在匿名函数中,这个'表示jquery元素,如何访问' options.name"?

这是插件' plugin.js':

(function ($, window, document, undefined) {

    'use strict';

    var plugin = 'box',
        defaults = {
            wight: 26,
            color: 'white'
        };

    function Plugin(element, options) {
        this.plugin = plugin;

        this.element = element;

        this.options = $.extend({}, defaults, options);

        $(this.element).fadeOut(1000, function () {
            console.log(this.options.name);          // <- how do I access options.name?
        });
    }

    Plugin.prototype = {
        f: function () {
            console.log(this.options.name);
        }
    };

    $.fn[plugin] = function (argument) {
        var method = argument,
            options = argument;

        return this.each(function () {
            if (!$.data(this, 'plugin_' + plugin)) {
                $.data(this, 'plugin_' + plugin, new Plugin(this, options));
            } else if ($.isFunction(Plugin.prototype[method])) {
                $.data(this, 'plugin_' + plugin)[method](Array.prototype.slice.call(arguments, 1));
            } else {
                console.error('unknown method ' + method);
            }
        });
    };
}(jQuery, window, document));

这是&#39; index.html&#39;:

<!DOCTYPE html>
<html class="no-overflow">
    <head>
        <meta charset="UTF-8">

        <title>Table example</title>

        <!-- jqwidgets styles -->
        <style type="text/css">

        </style>

        <!-- jquery framework -->
        <script type="text/javascript" src="../lib-scripts/jquery-1.10.2.min.js"></script>
        <!-- script -->
        <script type="text/javascript" src="plugin.js"></script>
        <script type="text/javascript">
            $(document).ready(function () {
                $('#id-a').box({ name: 'aaaa' });
                $('#id-b').box({ name: 'bbbb' });
                $('#id-a').box('f');
                $('#id-b').box('f');
            });
        </script>
    </head>

    <body>
        <div id="id-a"></div>
        <div id="id-b"></div>
    </body>
</html>

由于

1 个答案:

答案 0 :(得分:3)

两种方法,改变lambda函数的范围(使用bind),或创建对变量的独立引用并将其带入closure

1:使用Bind

$(this.element).fadeOut(1000, function () {
    console.log(this.options.name);          // <- how do I access options.name?
}.bind(this));

引用:

  

创建一个新函数,在调用时,将其关键字设置为   提供的值,在任何前面有给定的参数序列   在调用新函数时提供。

OR

2:关闭

var that = this;
$(this.element).fadeOut(1000, function () {
    console.log(that.options.name);          // <- how do I access options.name?
});

引用:

  

闭包是指独立(自由)变量的函数。在   简而言之,来自闭包的父函数的变量仍然存在约束   来自父母的范围。

另见What is the scope of variables in JavaScript?