在JavaScript函数中定义全局variables
是否可以在JavaScript函数中定义一个全局variables?
我想在其他函数中使用trailimage
variables(在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的最新规范中,全局范围内的新let
, const
和class
语句创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();