簡體   English   中英

調用函數來定義變量

[英]Calling a function to define a variable

在函數內部,我得到:

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函數。

您將從函數返回值,如下所示:

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

// elsewhere:
var myType = getMyType();

myType放在全局范圍內(我添加了“g”,如全局前綴):

// in global scope
var gMyType = null;

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

注意:我認為您需要更改$(this)部分

您可以像@RC建議的那樣將其置於全局范圍內,或者您可以像這樣定義它:

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

現在您可以從頁面上的任何位置訪問它:

alert(document.window.myType);

返回值可能是最好的解決方案,但這是另一個。 您可以將對象傳遞給作為作用域的函數,並將您的值設置為此對象的屬性。

如果您有一個方法來加載外部腳本以不污染全局命名空間,則通常會這樣做:

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

我不鼓勵你在你的情況下使用這個方法(返回值更有意義,更容易理解),但值得一提。

除非在閉包內設置函數,或者它是jQuery回調的一部分,它明確地將this設置為事件處理程序元素,否則你將希望避免在函數內部依賴它,因為它將引用它自己。

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

- 一個小三元的好措施 - 請注意,在這種情況下,如果對象確實在一個閉包中包含這個,只需設置this.myType = setMyType(this) ,如果你返回值,你將會很容易將它作為對象屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM