我目前正在阅读一本关于Javascript by Pragmatic的书,我对一件事感到困惑。他们有一节介绍如何使变量全局,本地或私有。
var foo = "local";
全局变量是全局范围对象的属性(在浏览器中为window
)
window.foo = "global";
事实上你可以做foo = "global";
而不首先用var foo
声明变量foo是一个“bug”。这是在ES5严格模式下修复的。
(function () { "use strict"; foo = 42; })()
给ReferenceError: foo is not defined
请注意,您可以通过在最外层范围内声明变量来使变量成为全局变量
var foo = "global";
function bar() {
var foo = "local";
}
应该注意的是,您不应该在最外层的范围内拥有任何代码。您应该将所有范围包装在匿名函数中,以便获得“模块级范围”。这意味着您拥有基于每个文件的顶级范围。这是模块模式的一部分。
在浏览器的上下文中,var关键字将变量范围限定为当前函数的变量。
var a = 10;
var b = function(a) {
console.log(a); # 15
}
b(15);
console.log(a); # 10
如果不包含var关键字,则会为其分配窗口范围并将其视为全局关键字。除非您有充分的理由将其排除,否则请始终包含var关键字。
如果变量仅存在于函数范围内,则该变量被视为私有。这通常采用匿名函数的形式。这实际上并不是一般意义上的私有变量,它只是一个局部变量。
(function() {
var x = 10;
})();
console.log(x); #undefined
本地变量和私有变量有什么区别?有吗?
取决于使用它们的上下文。一般来说,它们的意思相同。从OOP的角度来看,局部变量通常称为私有。
如何将变量设为全局变量或局部变量,他们说过将'var ='放在它之前,但它非常模糊。
当你将var
放在变量之前时,它就变成了局部变量,但在缺少的情况下,它变成了全局变量。例如:
var foo = 1; // local
foo = 1; // global equivalent to window.foo = 1 becomes part of window object
更实际的例子:
function myfunc(){
var foo = 1; // presence of var keyword
bar = 2; // absence of var keyword
}
alert(foo); // error eg undefined
alert(bar); // 2 because bar is part of window global object
Javascript具有函数作用域,在函数中使用var
关键字定义的任何变量都是函数的局部变量,并且在外部不可见。在没有var关键字的函数中定义的变量是全局变量,并且随处可见。
function test(){
var local = 'local'; // this is local
global = 'global'; // this is global
}
test(); // call a function
alert(local) // undefined
alert(global) // global
私有变量只有在构造对象时才有意义。典型的原型模式允许您添加任何必要的变量和辅助函数作为对象实例和/或其原型的属性,但这样做的缺点是任何有权访问该对象的人都可以看到它们。为避免这种情况,有一种替代模式,其中变量是构造函数的局部变量,所有方法都在构造函数范围内声明,只有公共方法被指定为对象的实际属性。
我发现你的所有答案都很奇怪,因为我认为如下:
/* A globally scoped and public variable */
var globalVariable = 'global';
/* A globally scoped and public constructor */
function Obj() {
/* private */
/* A locally scoped and private variable */
var privateVariable = 'private';
/* A locally scoped and private method */
privateMethod = function() {
return privateVariable;
}
/* public */
/* A locally scoped and public variable */
this.publicVariable = 'public';
/* A locally scoped and public method */
this.publicMethod = function() {
console.log(privateVariable + ' ' +
privateMethod() + ' ' +
globalVariable + ' ' +
this.publicVariable);
}
};
/* A globally scoped and public object */
var obj = new Obj();
/* displaying various variables and calling methods */
console.log(globalVariable); // global
console.log(obj.privateVariable); // undefined
/* if uncommented will display : ReferenceError: privateVariable is not defined */
// console.log(privateVariable);
/* if uncommented will display : TypeError: obj.privateMethod is not a function */
// obj.privateMethod();
privateMethod(); // nothing is displayed
console.log(obj.publicVariable); // public
obj.publicMethod(); // private private global public