使用/ whitout var的JavaScript命名空间

时间:2016-03-05 22:11:58

标签: javascript design-patterns

我需要知道:

之间的区别
Namespace = (function () { 
    return { 
        name: 'Module', 
        dep: ['d', 'a']
    };
})();

var Namespace = (function () { 
    return { 
        name: 'Module', 
        dep: ['d', 'a']
    };
})();

这很简单,但我仍然不明白。

2 个答案:

答案 0 :(得分:2)

就个人而言,我从不遗漏它。如果在函数内声明变量,那么如果你忽略变量变为全局变量的var关键字。这是因为变量在JavaScript中具有功能级别范围。在给定Namespace的示例中,无论是否使用var,都将是一个全局变量,因为它未在函数内声明。您可以通过将var添加到下面示例1中的Namespace变量来测试此理论。

示例1:

//I am a global variable with or without the var keyword because
//I am declared outside of a function.
Namespace = (function () { 
        return { 
            name: 'Module', 
            dep: ['d', 'a']
        };
})();


function test(){    

   Namespace = "I was changed because i have global scope";

}

//Run the test function to gain access to the global variable inside.
test();

//You will see that the value was changed by calling the test function 
console.log(Namespace);

现在,如果您将Namespace变量放在函数中,它现在仍然是没有var关键字的全局变量。在下面的示例中,我已将Namespace变量移到函数内部,并将var关键字添加到其中,以使其成为非全局函数。如果从示例2中函数内的var变量中删除Namespace关键字,您将看到它将是一个全局变量,并且脚本中的最后一个console.log(Namespace)调用将打印从Namespace函数中取出getNameSpace值。

示例2:

function getNameSpace(){

var Namespace = (function () { 
        return { 
            name: 'Module', 
            dep: ['d', 'a']
        };
})();


}

function test(){    

Namespace = "I have global scope even inside a function because I am missing the var keyword.";

}

test();

//print the value of the global variable Namespace
console.log(Namespace);

//call get nameSpace
getNameSpace();

//This will still print the value from the test function because the variable inside of
//get Namespace has local or function level scope because it has the var keyword.
console.log(Namespace);

希望所有这些现在更有意义。如果它不让我知道我会尽力帮助。要记住的一件好事是始终使用var关键字,如果您不希望脚本的其他部分直接访问变量,则将其放在函数内(也称为闭包)。

答案 1 :(得分:1)

使用var时,在函数的当前范围内创建变量。 如果没有var,将在全局范围内创建变量,这通常很糟糕。

使用var并始终在封闭范围(不是全局范围)中创建变量,除非您有充分的理由不这样做。