JavaScript関数でグローバル変数を定義することは可能ですか?
trailimage
変数(makeObj
関数で宣言されている)を他の関数で使用したい.
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title></title>
<script type="text/javascript">
var offsetfrommouse = [10, -20];
var displayduration = 0;
var obj_selected = 0;
function makeObj(address) {
**var trailimage = [address, 50, 50];**
document.write('<img id="trailimageid" src="' + trailimage[0] + '" border="0" style=" position: absolute; visibility:visible; left: 0px; top: 0px; width: ' + trailimage[1] + 'px; height: ' + trailimage[2] + 'px">');
obj_selected = 1;
}
function truebody() {
return (!window.opera && document.compatMode && document.compatMode != "BackCompat") ? document.documentElement : document.body;
}
function hidetrail() {
var x = document.getElementById("trailimageid").style;
x.visibility = "hidden";
document.onmousemove = "";
}
function followmouse(e) {
var xcoord = offsetfrommouse[0];
var ycoord = offsetfrommouse[1];
var x = document.getElementById("trailimageid").style;
if (typeof e != "undefined") {
xcoord += e.pageX;
ycoord += e.pageY;
}
else if (typeof window.event != "undefined") {
xcoord += truebody().scrollLeft + event.clientX;
ycoord += truebody().scrollTop + event.clientY;
}
var docwidth = 1395;
var docheight = 676;
if (xcoord + trailimage[1] + 3 > docwidth || ycoord + trailimage[2] > docheight) {
x.display = "none";
alert("inja");
}
else
x.display = "";
x.left = xcoord + "px";
x.top = ycoord + "px";
}
if (obj_selected = 1) {
alert("obj_selected = true");
document.onmousemove = followmouse;
if (displayduration > 0)
setTimeout("hidetrail()", displayduration * 1000);
}
</script>
</head>
<body>
<form id="form1" runat="server">
<img alt="" id="house" src="Pictures/sides/right.gif" style="z-index: 1; left: 372px;
top: 219px; position: absolute; height: 138px; width: 120px" onclick="javascript:makeObj('Pictures/sides/sides-not-clicked.gif');" />
</form>
</body>
</html>
はい、他の人が言っているように、グローバルスコープで(すべての関数の外側で)var
を使ってグローバル変数を宣言することができます。
<script>
var yourGlobalVariable;
function foo() {
// ...
}
</script>
あるいは、window
のプロパティに代入することもできます。
<script>
function foo() {
window.yourGlobalVariable = ...;
}
</script>
...ブラウザでは すべてのグローバル変数 var
で宣言されたグローバル変数はwindow
オブジェクトのプロパティです。 (最新の仕様、ECMAScript 2015では、グローバルスコープの新しいlet
、const
、およびclass
ステートメントは、グローバルオブジェクトのプロパティではないグローバルを作成します。ES2015の新しい概念です。)
( 暗黙のグローバルの恐怖 もありますが、意図的にやるのではなく、おそらくES5の"use strict"
を使用して、誤って回避するように最善を尽くします。)
すべてが言った:私はあなたがおそらく(そしてあなたはほぼ確実にできる限り)グローバル変数を避けたいと思います。私が言ったように、それらは最終的にwindow
のプロパティになります、そしてwindow
は既に _十分に混雑しています what id
を持つ(そしてちょうどname
を持つ多くの)要素を含みます。その次の仕様に関係なく、IEは、そこにname
があるものについてはほぼ何でもダンプします。
代わりに、あなたのコードをスコープ関数でラップし、そのスコープ関数に対してローカルな変数を使用し、そしてあなたの他の関数をその中で閉じさせる。
<script>
(function() { // Begin scoping function
var yourGlobalVariable; // Global to your code, invisible outside the scoping function
function foo() {
// ...
}
})(); // End scoping function
</script>
UPDATE1:あなたがコメントを読んだならば、この特定の命名規則について素敵な議論があります。
更新2:私の答えが投稿されてから命名規則がより正式になったようです。教えたり、本を書いたりする人々は、var
宣言とfunction
宣言について話します。
UPDATE3:これが私の主張を裏付ける追加のウィキペディア投稿です: http://ja.wikipedia.org/wiki/Declaration_(computer_programming)#Declarations_and_Definitions
...そして主な質問に答えます。あなたの関数の前のDECLARE変数。これはうまくいくでしょう、そしてそれはスコープの一番上であなたの変数を宣言するという良い習慣に従います:)
宣言するだけ
var trialImage;
外側。それから
function makeObj(address) {
trialImage = [address, 50, 50];
..
..
}
お役に立てれば。
いいえ、できません。関数の外側で変数を宣言するだけです。値を代入するのと同時に宣言する必要はありません。
var trailimage;
function makeObj(address) {
trailimage = [address, 50, 50];
関数の外側で宣言し、関数の内側で値を代入するだけです。何かのようなもの:
<script type="text/javascript">
var offsetfrommouse = [10, -20];
var displayduration = 0;
var obj_selected = 0;
var trailimage = null ; // GLOBAL VARIABLE
function makeObj(address) {
trailimage = [address, 50, 50]; //ASSIGN VALUE
あるいは、関数内の変数名から単に "var"を削除してもグローバルになりますが、コードをきれいにするには一度外部で宣言する方が良いでしょう。これも動作します。
var offsetfrommouse = [10, -20];
var displayduration = 0;
var obj_selected = 0;
function makeObj(address) {
trailimage = [address, 50, 50]; //GLOBAL VARIABLE , ASSIGN VALUE
私はこの例がもっと説明することを願っています: http://jsfiddle.net/qCrGE/
var globalOne = 3;
testOne();
function testOne()
{
globalOne += 2;
alert("globalOne is : " + globalOne );
globalOne += 1;
}
alert("outside globalOne is : " + globalOne);
testTwo();
function testTwo()
{
globalTwo = 20;
alert("globalTwo is " + globalTwo);
globalTwo += 5;
}
alert("outside globalTwo is :" + globalTwo);
関数の外側でtrailimage変数を定義し、その値をmakeObj関数に設定するのは非常に簡単です。今、あなたはどこからでもその価値にアクセスすることができます。
var offsetfrommouse = [10, -20];
var displayduration = 0;
var obj_selected = 0;
var trailimage;
function makeObj(address) {
trailimage = [address, 50, 50];
....
}
var Global = 'Global';
function LocalToGlobalVariable() {
//This creates a local variable.
var Local = '5';
//Doing this makes the variable available for one session
//(a page refresh - Its the session not local)
sessionStorage.LocalToGlobalVar = Local;
// It can be named anything as long as the sessionStorage references the local variable.
// Otherwise it won't work
//This refreshes the page to make the variable take effect instead of the last variable set.
location.reload(false);
};
//This calls the variable outside of the function for whatever use you want.
sessionStorage.LocalToGlobalVar;
これにはおそらく多くの構文エラーがあることを理解していますが、その一般的な考えは...これを指摘してくれたLayZeeに感謝します...ローカルおよびセッションStorageが http:// wwwにあるものを見つけることができます。 w3schools.com/html/html5_webstorage.asp 私は自分のコードに同じものを必要としていました、そしてこれは本当に良い考えでした。
古典的な例:
window.foo = 'bar';
IIFE を使用して、ベストプラクティスに従って現代的で安全な例を示します。
;(function (root) {
'use strict'
root.foo = 'bar';
)(this));
最近では、 WebStorage API を使うという選択肢もあります。
localStorage.foo = 42;
または
sessionStorage.bar = 21;
性能的には、変数に値を格納するよりも明らかに遅いかどうかわかりません。
私は使えますか... に記載されているように、広範囲にわたるブラウザサポート