调用函数来定义变量

时间:2010-08-30 05:03:39

标签: javascript jquery scope

在一个函数中,我得到了:

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;
  }
}

当我在main函数中调用setMyType()时,main函数无法访问myType。如果我在setMyType()内警告(myType),则警报包含正确的值。但主要功能无法看到这个价值。

这是一个范围问题,但我不确定如何解决它。我尝试在main函数中定义myType并将其传递给setMyType()。虽然setMyType()从main函数中获取myType的值就好了,但它仍然没有将更改后的值返回给main函数。

5 个答案:

答案 0 :(得分:4)

您将从函数返回值,如下所示:

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

// elsewhere:
var myType = getMyType();

答案 1 :(得分:0)

myType置于全局范围内(我添加了“g”,如全局前缀):

// in global scope
var gMyType = null;

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

注意:我认为您需要更改$(this)部分

答案 2 :(得分: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);

答案 3 :(得分: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

我不鼓励你在你的情况下使用这个方法(返回值更有意义,更容易理解),但值得一提。

答案 4 :(得分:0)

除非在闭包内设置函数,或者它是jQuery回调的一部分,它明确地将this设置为事件处理程序元素,否则你将希望避免在函数内部依赖它,因为它将参考自己。

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

- 一个好的衡量标准的三元组 - 请注意,在这种情况下,如果对象确实在一个闭包中包含这个,只需设置this.myType = setMyType(this)并且如果你返回值,那么你就会很容易将它作为对象属性。