是否可以在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>
答案 0 :(得分:683)
是的,正如其他人所说,你可以在全局范围内(在所有函数之外)使用var
来声明一个全局变量:
<script>
var yourGlobalVariable;
function foo() {
// ...
}
</script>
或者,您可以在window
上分配属性:
<script>
function foo() {
window.yourGlobalVariable = ...;
}
</script>
...因为在浏览器中,所有全局变量用var
声明的全局变量是window
对象的属性。 (在最新的规范,ECMAScript 2015中,全局范围内的新let
,const
和class
语句创建的全局对象不是全局对象的属性; ES2015中的新概念。)
(还有the horror of implicit globals,但不要故意这样做,尽量避免意外地使用ES5的"use strict"
。)
所有这一切:如果你可能的话,我会避免全局变量(你几乎可以肯定)。正如我所提到的,它们最终成为window
的属性,而window
已经plenty crowded enough,所有元素都带有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>
答案 1 :(得分:18)
UPDATE1:如果您阅读了评论,那么就这个特定的命名约定进行了很好的讨论。
UPDATE2:似乎自从我的回答发布后,命名约定变得更加正式。教书,写书等的人都会谈论var
声明和function
声明。
UPDATE3:这是支持我的观点的其他维基百科帖子:http://en.wikipedia.org/wiki/Declaration_(computer_programming)#Declarations_and_Definitions
......并回答主要问题。函数前的DECLARE变量。这将起作用,它将符合在范围顶部声明变量的良好实践:)
答案 2 :(得分:14)
只需声明
var trialImage;
外部。然后
function makeObj(address) {
trialImage = [address, 50, 50];
..
..
}
希望这有帮助。
答案 3 :(得分:10)
只需在函数外部声明它,并在函数内部赋值。类似的东西:
<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);
答案 4 :(得分:10)
var trailimage;
function makeObj(address) {
trailimage = [address, 50, 50];
答案 5 :(得分:3)
在函数外部定义trailimage变量并在makeObj函数中设置其值非常简单。现在,您可以从任何地方访问其值。
var offsetfrommouse = [10, -20];
var displayduration = 0;
var obj_selected = 0;
var trailimage;
function makeObj(address) {
trailimage = [address, 50, 50];
....
}
答案 6 :(得分:2)
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指出这一点......你可以找到本地和会话存储在http://www.w3schools.com/html/html5_webstorage.asp的内容。我的代码需要相同的东西,这是一个非常好的主意。
答案 7 :(得分:1)
是的,你可以。只是不要使用var,不要使用let。只需初始化变量,它就会自动分配给全局:
function firstFunction() {
if (typeof(testVar) === "undefined") {testVar = 1;} //initializing variable if not initialized
testVar += 1;
console.log('Test variable inside 1st function: '+testVar);
}
function secondFunction() {
testVar += 1;
console.log('Test variable inside 2nd function: '+testVar);
}
firstFunction();
secondFunction();
testVar += 1;
console.log('Test variable outside: '+testVar);
答案 8 :(得分:0)
经典示例:
window.foo = 'bar';
使用IIFE:
遵循最佳做法的现代安全示例;(function (root) {
'use strict'
root.foo = 'bar';
)(this));
如今,还可以选择使用WebStorage API
localStorage.foo = 42;
或
sessionStorage.bar = 21;
Performancewise,我不确定它是否明显慢于在变量中存储值。
中所述的广泛浏览器支持答案 9 :(得分:0)
因此,您希望函数内部的变量在函数外部可用吗?为什么不返回函数内部变量的结果?
var x = function returnX { var x = 0; return x; }
是个主意...
<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;
return trailimage;
}
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>
我还没有测试过,但是如果您的代码在此小改动之前就可以工作,那么它应该可以工作。
答案 10 :(得分:0)
使用window
对象不是一个好主意。正如我在评论中所见
'use strict';
function showMessage() {
window.say_hello = 'hello!';
}
console.log(say_hello);
使用我们首先需要调用showMessage function
的say_hello变量将引发错误。
答案 11 :(得分:0)
javascript中有三种类型的独家新闻:
如果在变量名称之前添加Var
,则将确定其位置
例如:
var num1 = 18; // Global scope
function fun() {
var num2 = 20; // Local (Function) Scope
if (true) {
var num3 = 22; // Block Scope (within an if-statement)
}
}
num1 = 18; // Global scope
function fun() {
num2 = 20; // Global Scope
if (true) {
num3 = 22; // Global Scope
}
}
答案 12 :(得分:0)
全局变量在函数外部声明,以便在整个程序中访问,而局部变量则使用 var 存储在函数内,仅在该函数的作用域内使用。如果不使用 var 声明变量,即使它在函数内部,它仍然会被视为全局变量。 参考文献 = https://www.freecodecamp.org/news/global-variables-in-javascript-explained/
答案 13 :(得分:-1)
这是一个可能很有用的示例代码。
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
我在这里找到了一个很好的答案How-can-one-declare-a-global-variable-in-JavaScript
答案 14 :(得分:-1)
这是另一种简单的方法,可以在不使用全局变量的情况下使变量在其他函数中可用:
function makeObj() {
// var trailimage = 'test';
makeObj.trailimage = 'test';
}
function someOtherFunction() {
document.write(makeObj.trailimage);
}
makeObj();
someOtherFunction();
答案 15 :(得分:-2)
如果您正在创建启动函数,则可以通过以下方式定义全局函数和变量:
function(globalScope)
{
//define something
globalScope.something() {
alert("It works");
};
}(window)
因为使用此参数全局调用该函数,所以这是全局范围。 所以,这件事应该是一件全球性的事情。