Javascript 声明具有相同名称的两个变量
是否可以调用在函数外部设置的同名变量Javascript 声明具有相同名称的两个变量,javascript,jquery,variables,Javascript,Jquery,Variables,是否可以调用在函数外部设置的同名变量 var a = $(window).width(); // I want to call this variable if(!$.isFunction(p)){ var a = $(window).height(); // Not this one alert(a); } 在本例中,您实际上已经重新定义了a的值。绝对没有办法引用具有相同名称的不同变量,因为它只是一种重新定义。示例: var a=10; if(true){ var
var a = $(window).width(); // I want to call this variable
if(!$.isFunction(p)){
var a = $(window).height(); // Not this one
alert(a);
}
在本例中,您实际上已经重新定义了
a
的值。绝对没有办法引用具有相同名称的不同变量,因为它只是一种重新定义。示例:
var a=10;
if(true){
var a=5;
}
alert(a)// it will return a=5;
var a=10;
var a=5;
//both are same way assign value
在js中,if语句不是作用域,它在函数中处处可见。必须更改变量名如果要声明全局变量,可以通过
window.varname="This is a global variable";
你可以通过
alert(window.varname);
现在,您还可以在具有相同名称的函数中使用局部变量
var varname="This is a local variable";
您可以正常访问它
这是您的代码,您可以访问全局变量,而不是本地变量
var p = ['foo',''];
window.a = $(window).width();
if(!$.isFunction(p)){
var a = $(window).height();
alert(window.a);
}
JavaScript中没有blockscope(至少在ES6之前是这样)。
就像你期待的那样。看见
获取JavaScript中确实存在的作用域的优秀摘要
提防吊装
此外,您不应该在代码中散布var
声明,而应该明确地将它们放在函数的顶部。这就是Javscript将如何帮助他们的地方:
# so if you have a function like this
var i = 5;
function testvar () {
alert(i);
var i=3;
}
testvar();
# the alert window will contain undefined.
# because internally, it's been changed into this:
var i = 5;
function testvar () {
var i;
alert(i);
i=3;
}
testvar();
尽量减少全局范围的使用
阅读
听听道格·克罗克福德对此事的看法。实际上,花一个小时观看整个演讲。不,你不能,因为你已经在
相同的范围内重新定义了变量名
,并且由于被提升的变量
你的代码将由javascript以以下模式解释:
var p, a;
p = ['foo',''];
a = $(window).width(); // I want to call this variable
if(!$.isFunction(p)){
a = $(window).height(); // Not this one
alert(a);
}
现在您可以很容易地看到
变量a
将被替换,而不是创建JavaScript有两个作用域:全局
和局部
。在您的示例中,a
两次都在全局范围内,因此您只需重新定义它
但是,您可以指定跳过本地
范围中的变量,并从全局
获取该变量。考虑这个例子:
var a = 1;
function foo () {
var a = 2;
console.log("var a is: " + window.a);
console.log("local var a is: " + a);
}
foo ();
将“变量a为:1”\n“本地变量a为:2\n”
记录到控制台。这是接近你所需要的
var abc = new Array();
abc[0] = 'str1';
abc[1] = 'str2';
在这种情况下使用数组您可以这样做:
var p = ['foo',''];
var a = $(window).width(); // I want to call this variable
if(!$.isFunction(p)){
(function(b){
var a = $(window).height();
alert(b);
})(a);
}
无需使用全局作用域,只需创建一个匿名函数,并使用a
作为参数调用它。函数b
内部是对函数外部a
变量的引用
不修改javascript中的窗口对象以编写干净且可维护的代码是一个很好的实践
更少的bug和问题。我的意思是,永远不要做
窗口的事。对您的代码有害。在像您这样的代码片段中,变量a
正在被重新定义。这是因为if
语句没有为变量创建另一个作用域。然而,函数确实如此
在这种情况下:
var a = 0; // global
function doStuff() {
var a = 10; // local
alert(a);
alert(window.a)
}
alert(a);
doStuff();
alert(a);
在函数doStuff
中,变量a
正在重新定义。因此,此剪断将提醒编号0
,10
,0
,0
。这证明全局变量没有在函数内部重新定义,因为调用doStuff
后打印a
不会更改全局范围内a
的值
可以访问函数外部的变量a
,因为任何未在非全局范围内声明的变量都放置在窗口
对象内。但是,如果使用此代码段(调用匿名函数,创建新作用域):
您无法在doStuff
函数中访问a
的值。您仍然可以使用window.a
访问全局变量
但是,在您的情况下,if
语句没有创建新的作用域,因此您将变量a
重新定义为新值$(窗口)。height()
试试这个(模式)
jsFIDLE这很简单,不要给他们相同的名字。@adeneo是第二个变量被覆盖了吗?我认为,C++中的代码会很好,不是吗?C++中有局部变量和全局变量,它们的范围不同,不是吗?@腺苷,我想知道是否有可能?为什么要重新分配它,如果你想使用它的初始值?没有意义。这是不可能的,if语句没有特殊的作用域,因此您不能在同一作用域中有两个同名的变量并同时访问这两个变量,后者将覆盖前者,因此它们应该有不同的名称。谢谢,我没有意识到在使用var
关键字时会发生这种情况。@Sharikov我删除我的评论,它们比有用的更容易误导人。使用window.varname只是一种糟糕的设计。是的,它是有效的,但不,你不应该这样做。如果您真的坚持这样做,至少在全局空间中创建一些其他对象,并使用它来代替窗口。
var a = 0; // global
function doStuff() {
var a = 10; // local
alert(a);
alert(window.a)
function() {
var a = 20; // even more local
alert(a);
alert(window.a);
}();
}
alert(a);
doStuff();
alert(a);
var p = ['foo', ''];
var a = function (name) {
return (
name === "height"
? $(window).height()
: (name === "width" ? $(window).width() : name)
)
};
if (!$.isFunction(p)) {
// `$(window).width()` , `$(window).height()`
alert( a("width") + "\n" + a("height") );
}