2016-06-17 92 views
0

我要創建2個函數,給我X,東西ÿ這樣我就可以比較的2臺x和y的。以下是其中一項功能。第二個會做同樣的事情。如何訪問函數外的var?

我可以CONSOLE.LOG position.gx和position.gy裏面的功能,但我如何訪問它的功能外,所以我可以做一些像position.hx比較position.gx?

我知道它是範圍問題,但我無法弄清楚如何重新寫這個,所以我可以我可以比較position.gx從另一個函數的東西。

(與正在自學成才是我先掛了上最愚蠢的事情的問題。)

function guyLocation() { 

var myElement = document.querySelector("#guy"); 
var xPosition = 0; 
var yPosition = 0; 

    function getPosition(el) { 
     this.addEventListener("load", true); 

     while (el) { 
     if (el.tagName == "BODY") { 

      var xScrollPos = el.scrollLeft || document.documentElement.scrollLeft; 
      var yScrollPos = el.scrollTop || document.documentElement.scrollTop; 

      xPosition += (el.offsetLeft - xScrollPos + el.clientLeft); 
      yPosition += (el.offsetTop - yScrollPos + el.clientTop); 
     } else { 
      xPosition += (el.offsetLeft - el.scrollLeft + el.clientLeft); 
      yPosition += (el.offsetTop - el.scrollTop + el.clientTop); 
     } 

     el = el.offsetParent; 
     } 
     return { 
     gx: xPosition, 
     gy: yPosition 
     }; 
    }; 

    document.body.onkeydown = function() { 
     position = getPosition(myElement); 
     console.log(position.gx + ", " + position.gy); 
    }; 
}; 
+0

簡短的回答 - 聲明的任何職能之外的變量使他們「全局」。然後該變量在函數內部可用。 –

+0

看起來你已經解決了你的問題。你的代碼中的'position'是一個[隱含的全局](http://blog.niftysnippets。org/2008/03/horror-of-implicit-globals.html)(壞習慣),你可以在任何地方訪問它。你可以在全局範圍聲明'position'。 – Teemu

+0

查看[閉包](https://developer.mozilla.org/en/docs/Web/JavaScript/Closures)。這是你正在尋找的。 – DavidDomain

回答

1

您可以導出功能,並設置它的一些特性。 (這是一個有點古怪,但應該告訴你如何/它在做什麼):

NOTE(查看此代碼的最後幾行,以使更改)

這種簡單的標記:

<div id="guy"> 
    Howdy 
</div> 

此代碼:

function guyLocation() { 
    var myElement = document.querySelector("#guy"); 

    var xPosition = 0; 
    var yPosition = 0; 

    function getPosition(el) { 
    // this.addEventListener("load", true); 

    while (el) { 
     if (el.tagName == "BODY") { 

     var xScrollPos = el.scrollLeft || document.documentElement.scrollLeft; 
     var yScrollPos = el.scrollTop || document.documentElement.scrollTop; 

     xPosition += (el.offsetLeft - xScrollPos + el.clientLeft); 
     yPosition += (el.offsetTop - yScrollPos + el.clientTop); 
     } else { 
     xPosition += (el.offsetLeft - el.scrollLeft + el.clientLeft); 
     yPosition += (el.offsetTop - el.scrollTop + el.clientTop); 
     } 

     el = el.offsetParent; 
    } 
    return { 
     gx: xPosition, 
     gy: yPosition 
    }; 
    }; 

    document.body.onkeydown = function() { 
    guyLocation.position = getPosition(myElement); 
    console.log(guyLocation.position.gx + ", " + guyLocation.position.gy); 
    }; 
    guyLocation.getPosition = getPosition;// allows outside calls 
}; 

guyLocation();// sets stuff up, exports function 
console.log(guyLocation.position);// undefined 
// sets value 
guyLocation.position = guyLocation.getPosition(document.querySelector("#guy")); 
console.log(guyLocation.position);// Object {gx: 8, gy: 8} 
0

我不認爲有一個問題在這裏,申報窗口範圍變量(外任何地方的任何代碼體)。作爲設計人員的解決方案,檢查類(原型)並創建一個跟蹤某個對象位置並更新它的引擎對象,將此引擎存儲在窗口範圍內,然後您可以從任何地方查詢它。你還必須創建一個更復雜的遊戲引擎實現的基礎,(只是猜測那是什麼回事),在那裏你可以創建一個定時器的更新循環,並具有存儲在您的引擎對象的精靈,將管理更新和查詢所有數據

+0

你是對的,發生了什麼,我會看看類,但我想我的問題是我將如何重寫我有什麼,所以我可以獲得當前範圍以外的變量。我試着把var gx放在函數之外,但是它沒有定義。 – NJeffries

+0

上面guyLocation,放置'var position'然後每當你分配到位置(除非你有範圍obscurity發生)它會進入你的全局變量位置 – kirinthos

1

我相信你真的想要做的是採取略有不同的方法來解決你的問題。

如果您創建module - 處理移動的代碼塊,您可以公開任何需要在別處使用的內部方法。

下面是一些鏈接,可以幫助

視頻是一個在一系列那種可以引導你一步一步怎麼去的揭示模塊模式。

這將將在第一種奇怪,但它是非常值得學習的,因爲它是兩者在JavaScript中很常用,也很強大。

0

移動的keydown監聽功能外呼......

function guyLocation() { 

    var myElement = document.querySelector("#guy"); 
    var xPosition = 0; 
    var yPosition = 0; 

    // return the parts you want to expose outside the function scope... 
    return { 
     getPosition: getPosition 
    }; 

    function getPosition(el) { 
     this.addEventListener("load", true); 

     while (el) { 
      if (el.tagName == "BODY") { 

       var xScrollPos = el.scrollLeft || document.documentElement.scrollLeft; 
       var yScrollPos = el.scrollTop || document.documentElement.scrollTop; 

       xPosition += (el.offsetLeft - xScrollPos + el.clientLeft); 
       yPosition += (el.offsetTop - yScrollPos + el.clientTop); 
      } else { 
       xPosition += (el.offsetLeft - el.scrollLeft + el.clientLeft); 
       yPosition += (el.offsetTop - el.scrollTop + el.clientTop); 
      } 

      el = el.offsetParent; 
     } 
     return { 
      gx: xPosition, 
      gy: yPosition 
     }; 
    } 

} 

function dollLocation() { 

    // return the parts you want to expose outside the function scope... 
    return { 
     getPosition: getPosition 
    }; 

    function getPosition(el) { 
     // more logic here... 
    } 

} 

// put this part outside the `guyLocation` function 
document.body.onkeydown = function() { 
    // access different functions, and compare in here... 
    guyPosition = getPosition(myElement); 
    dollPosition = getPosition(myElement); 
    console.log(guyPosition.gx + ", " + guyPosition.gy); 
    console.log(dollPosition.gx + ", " + dollPosition.gy); 
};