Вызов функции для определения переменной - PullRequest
1 голос
/ 30 августа 2010

Внутри функции у меня есть:

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 из основной функции просто отлично, оно все равно не возвращает измененное значение основной функции.

Ответы [ 5 ]

4 голосов
/ 30 августа 2010

Вы бы вернули значение из функции, например так:

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

// elsewhere:
var myType = getMyType();
0 голосов
/ 30 августа 2010

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

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

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

0 голосов
/ 30 августа 2010

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

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

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 голосов
/ 30 августа 2010

вы можете поместить его в глобальную область, как предложено @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 голосов
/ 30 августа 2010

Поместите myType в глобальную область (я добавил глобальный префикс типа "g"):

// in global scope
var gMyType = null;

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

Примечание: я думаю, вам нужно изменить $(this) часть

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...