声明两个具有相同名称的变量

时间:2014-05-17 10:29:35

标签: 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);
}

FIDDLE

10 个答案:

答案 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)

JavaScript中没有blockcope(至少在ES6之前)。

就像你似乎期望从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。因此,此剪辑将提醒数字01000。这证明全局变量未在函数内重新定义,因为在调用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有两个范围:globallocal。在您的示例中,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") );
}

jsfiddle http://jsfiddle.net/guest271314/2tuK4/