在JavaScript函数中定义全局variables

是否可以在JavaScript函数中定义一个全局variables?

我想在其他函数中使用trailimagevariables(在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声明一个全局variables:

 <script> var yourGlobalVariable; function foo() { // ... } </script> 

或者,您可以在window上指定属性:

 <script> function foo() { window.yourGlobalVariable = ...; } </script> 

…因为在浏览器中,用var声明的所有全局variables全局variables都是window对象的属性。 (在ECMAScript 2015的最新规范中,全局范围内的新letconstclass语句创build了全局对象属性的全局variables,这是ES2015中的一个新概念。)

(也有隐式全局的恐怖 ,但是不要故意这样做,尽量避免意外地这样做,也许通过使用ES5的"use strict"

所有这一切说:如果可能的话,我会避免全局variables(你几乎可以肯定)。 正如我所提到的,它们最终成为window属性,而window已经足够拥挤 ,所有具有id元素(以及许多只有一个name )被倾倒在里面(不pipe即将到来的规范如何,IE会倾倒任何东西在那里有一个name )。

相反,将代码封装在范围函数中,并使用该范围函数的局部variables,并将其他函数封闭在范围函数中:

 <script> (function() { // Begin scoping function var yourGlobalVariable; // Global to your code, invisible outside the scoping function function foo() { // ... } })(); // End scoping function </script> 

UPDATE1:如果你阅读这些评论,围绕这个特定的命名约定有一个很好的讨论。

UPDATE2:似乎自从我的答案已经公布,命名约定变得更加正式。 教书,写书等人谈论有关无function申报, function宣言。

UPDATE3:这是额外的维基百科post,支持我的观点: http : //en.wikipedia.org/wiki/Declaration_( computer_programming)#Declarations_and_Definitions

…并回答主要问题。 在函数之前使用DECLAREvariables。 这将工作,它将符合在范围的顶部声明您的variables的良好做法:)

只是申报

 var trialImage; 

外。 然后

 function makeObj(address) { trialImage = [address, 50, 50]; .. .. } 

希望这可以帮助。

不,你不能。 只需在函数之外声明该variables即可。 您不必在分配值时同时声明它:

 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 

或者简单地从函数内部的variables名中除去“var”也会使其成为全局variables,但是为了更简洁的代码,最好在外部声明它。 这也将工作:

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

定义函数外的trailimagevariables非常简单,并在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指出这一点…你可以find什么本地和会话存储在http://www.w3schools。 com / html / html5_webstorage.asp 。 我需要我的代码相同的东西,这是一个非常好的主意。

这里是一个示例代码,可能会很有帮助。

  var Human = function(){ name = "Shohanur Rahaman"; // global variable this.name = "Tuly"; // constructor variable var age = 21; }; var shohan = new Human(); document.write(shohan.name+"<br>"); document.write(name); document.write(age); // undefined cause its local variable 

在这里,我find了一个很好的答案。 如何在JavaScript中声明一个全局variables

经典示例:

 window.foo = 'bar'; 

使用IIFE遵循最佳实践的现代安全示例:

 ;(function (root) { 'use strict' root.foo = 'bar'; )(this)); 

现在,也可以select使用WebStorage API

 localStorage.foo = 42; 

要么

 sessionStorage.bar = 21; 

在性能上,我不确定它是否比在variables中存储值慢得多。

广泛的浏览器支持,如上所述可以使用…

如果你正在创build一个启动函数,你可以这样定义全局函数和variables:

 function(globalScope) { //define something globalScope.something() { alert("It works"); }; }(window) 

因为函数是用这个参数全局调用的,所以这里是全局作用域。 所以,这个东西应该是全球性的。

这是另一个简单的方法,可以在其他函数中使用variables而不必使用全局variables:

 function makeObj() { // var trailimage = 'test'; makeObj.trailimage = 'test'; } function someOtherFunction() { document.write(makeObj.trailimage); } makeObj(); someOtherFunction();