Проблемы с областью действия плагина JQuery - PullRequest
2 голосов
/ 02 сентября 2011

Я чувствую себя немного невежественным, но я полагаю, что какое-то образование мне не повредит.

Я упростил свой код, чтобы обрисовать проблемы - проблема в том, что когда foo () вызывается изнутриМетод init, он не может получить доступ к предполагаемым глобальным переменным, a, b, c и настройкам.Они определены вне области действия метода, так почему они недоступны?

Например, настройки четко определены непосредственно перед вызовом foo, так почему foo не видит настройки?

(function(jQuery) {

a = new Date(); 
var b;
var c = 1;
settings = 0; // Here or not - same issue

var methods = {
    init : function(settings) {

        c = $(this);            

        settings = jQuery.extend({
                id: Math.floor(Math.random()*1001),
                x: 3;
                etc: 2        
            }, settings || {});            

        m = 1;

        foo();            
    }
};

function foo() 
{
    x = settings.x; // settings is not defined
    var n = c.m;

    return x;
}

jQuery.fn.bar= function(method) {

    if (methods[method]) // If we have a method that exists
    {
        return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
    } 
    else if ( typeof method === 'object' || ! method ) // Otherwise if we get passed an object (settings) or nothing, run the init.
    {
        return methods.init.apply( this, arguments );
    } 
    else 
    {
        $.error( 'Method ' +  method + ' does not exist' ); // Otherwise we have an error.
    }                

};
})(jQuery);

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 02 сентября 2011

Вы создаете локальную копию настроек, когда определяете ее как аргумент для своей функции инициализации:

// Here there is a global settings
init : function(settings) {
    // Here there is a local settings
    // Changes made to it won't affect the global

Так, когда foo вызывается, настройки по-прежнему равны 0, и вы получаете доступ к Number(0).x, которыйне определено.

Простое удаление локальной копии настроек решит вашу проблему:

init : function(s) {

И измените settings || {} на s || {}

0 голосов
/ 02 сентября 2011

это потому, что функция init принимает настройки параметров, которые являются локальными для init

если foo предназначен для доступа к настройкам переменных init sets, он должен вызвать foo

foo(settings);

function foo(settings) 

или

Если вы не хотите закрывать, чтобы решить вашу проблему, тогда init должен взять другое имя параметра, а затем установить значение настроек.

...