2010-08-30 5 views
1

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

var myType; 
if ($(this).is(".whatever")){ 
    myType = typeOne; 
} else if ($(this).is(".something")){ 
    myType = typeTwo; 
} 

Это прекрасно работает. Однако я хочу превратить это в отдельную функцию, которую я могу назвать, поскольку я использую ее в нескольких разных местах. Функция я пишу:

function setMyType(){ 
    var myType; 
    if ($(this).is(".whatever")){ 
    myType = typeOne; 
    } else if ($(this).is(".something")){ 
    myType = typeTwo; 
    } 
} 

Когда я называю setMyType() в моей основной функции, основная функция не может получить доступ к MyType. Если я предупреждаю (myType) внутри setMyType(), предупреждение содержит правильное значение. Но основная функция не может видеть эту ценность.

Это проблема с областью действия, но я не уверен, как ее решить. Я попытался определить myType внутри основной функции и передать ее в setMyType(). В то время как setMyType() получает значение myType от основной функции просто отлично, он все равно не возвращает измененное значение в основную функцию.

+2

, кстати, ваша функция setMyType() не может разрешить $ (это), вам нужно заменить его другим селектором jquery. –

ответ

4

Вы бы вернуть значение из функция, как это:

function getMyType(){ 
    var myType; 
    if ($(this).is(".whatever")){ 
    myType = typeOne; 
    } else if ($(this).is(".something")){ 
    myType = typeTwo; 
    } 
    return myType; 
} 

// elsewhere: 
var myType = getMyType(); 
+0

+1, хотя метод лучше назвать 'getMyType' или аналогичным – harto

+0

Хорошая точка, отредактированная. –

+0

Это было сделано. Я думал, что раньше пытался вернуть стоимость, но, должно быть, я ошибся. – motorfirebox

0

Помещенный myType в глобальном масштабе (я добавил «г» как глобальный префикс):

// in global scope 
var gMyType = null; 

function setMyType(){ 
    if ($(this).is(".whatever")){ 
    gMyType = typeOne; 
    } else if ($(this).is(".something")){ 
    gMyType = typeTwo; 
    } 
} 

NB: Я думаю, что нужно изменить $(this) часть

0

вы можете поместить его в глобальном масштабе, как это предлагается @RC или вы можете определить это следующим образом:

function setMyType(){ 
    if ($(this).is(".whatever")){ 
    document.window.gMyType = typeOne; 
    } else if ($(this).is(".something")){ 
    document.window.gMyType = typeTwo; 
    } 
} 

теперь вы можете получить к нему доступ из любого места на странице:

alert(document.window.myType); 
0

Возвращаясь значение, вероятно, является лучшим решением, но вот еще один. Вы можете передать объект функции, которая функционирует как область действия, и ваше значение будет установлено как свойство этого объекта.

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

function setMyType(scope){ 
    if ($(this).is(".whatever")){ 
    scope.myType = typeOne; 
    } else if ($(this).is(".something")){ 
    scope.myType = typeTwo; 
    } 
} 

, который будет использоваться как:

var scope = {}; 
setMyType(scope); 
//now scope.myType contains your value 

Я не призываю вас использовать этот метод в вашей ситуации (возврат значения имеет гораздо больший смысл и его легче понять), но стоит упомянуть его.

0

Если функция не установлена ​​внутри замыкания, или она является частью обратного вызова jQuery, который явно устанавливает элемент this в элемент обработчика события, который вы хотите избежать, полагаясь на это внутри функции, поскольку он будет ссылаться на себя ,

function setMyType(obj){ 
    myType = ($(obj).is(".whatever"))?typeOne:(($obj).is(".something"))?typeTwo:null; 
    return myType; 
} 

--a немного тройная для хорошего measure-- Разума вы это было бы так же легко, в этом случае, если объект находится в этом в затворе, чтобы просто установить this.myType = setMyType(this) и если вы вернете значение, которое вы будете иметь его как свойство объекта.

+0

В фактическом коде у меня есть var that = $ (this), и я использую 'that' в вызываемых мной функциях. – motorfirebox

Смежные вопросы