2013-10-11 64 views
0

我不知道如何在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)); 

這是'的index.html':

<!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> 

感謝

回答

3

兩種方式,改變lambda函數的範圍(與bind),或建立一個獨立的參考變量,並把它放入closure

1:有綁定

$(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?

相關問題