在一个函数中,我得到了:
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函数。
答案 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)
并且如果你返回值,那么你就会很容易将它作为对象属性。