是否可以调用在函数外部设置的相同名称变量?
var a = $(window).width(); // I want to call this variable
if(!$.isFunction(p)){
var a = $(window).height(); // Not this one
alert(a);
}
答案 0 :(得分:5)
在这种情况下,您实际上已重新定义a
的值。绝对没有办法引用具有相同名称的不同变量,因为它只是作为重新定义。
答案 1 :(得分:5)
如果要声明全局变量,可以通过
进行声明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);
}
答案 2 :(得分:3)
示例:
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语句不是作用域,它在函数的每个位置都可见。你必须改变变量名称
答案 3 :(得分:3)
就像你似乎期望从if块一样。看到 What is the scope of variables in JavaScript? 有关JavaScript中存在做的范围的精彩摘要。
此外,您不应该通过代码填写var
声明,而是明确地将它们放在函数的顶部。无论如何,这就是Javscript hoist的地方:
# 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();
读 What is meant by “leaking” into global scope?
听听Doug Crockford对say的看法。实际上,花一个小时观看整个演讲。
答案 4 :(得分:2)
你可以这样做:
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中修改窗口对象来编写干净且可维护的代码。
减少错误和问题。我的意思是,永远不要做window.a
事。你的代码是邪恶的。
答案 5 :(得分:2)
在您的代码段中,正在重新定义变量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
。这证明全局变量未在函数内重新定义,因为在调用a
后打印doStuff
不会更改全局范围中a
的值。
可以访问函数外部的变量a
,因为未在非全局范围内声明的任何变量都放在window
对象内。但是,如果使用此代码段(调用匿名函数,创建新范围):
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);
您无法在a
函数中访问doStuff
的值。您仍然可以使用window.a
访问全局变量。
但是,在您的情况下,if
语句不会创建新范围,因此您要将变量a
重新定义为新值$(window).height()
。
答案 6 :(得分:1)
不可以,因为你已经重新定义了same scope
中的变量名称,并且由于hoisted variables
你的代码将被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);
}
现在您可以轻松地看到variable a
将被替换而不是创建
答案 7 :(得分:1)
JavaScript有两个范围:global
和local
。在您的示例中,a
两次都在全局范围内,因此您只需重新定义它。
但是,您可以指定跳过local
范围内的变量,并从global
获取一个变量。考虑这个例子:
var a = 1;
function foo () {
var a = 2;
console.log("var a is: " + window.a);
console.log("local var a is: " + a);
}
foo ();
将"var a is: 1"\n"local var a is: 2\n"
记录到控制台。这与你需要的一样接近
答案 8 :(得分:1)
var abc = new Array();
abc[0] = 'str1';
abc[1] = 'str2';
在这种情况下使用数组
答案 9 :(得分:1)
试试这个(模式)
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") );
}