全局和本地及私人功能(Javascript)

时间:2012-02-14 21:15:19

标签: javascript function global-variables local private

我目前正在阅读一本关于Javascript by Pragmatic的书,我对一件事感到困惑。他们有一节介绍如何将变量设为全局变量,本地变量或私有变量。

  1. 本地变量和私有变量有什么区别?有吗?

  2. 如何将变量设为全局变量或局部变量,他们说过将'var ='放在它之前,但它非常模糊。

6 个答案:

答案 0 :(得分:8)

  1. 没有,人们使用“私人”,因为他们错了并且打算说“本地”

  2. 局部变量定义为

  3. var foo = "local";

    全局变量是全局范围对象的属性(在浏览器中为window

    window.foo = "global";

    如果没有先使用foo = "global";声明变量foo,则可以执行var foo这一事实是一个“错误”。这是在ES5严格模式下修复的。

    (function () { "use strict"; foo = 42; })()

    给出ReferenceError: foo is not defined

    请注意,您可以通过在最外层范围内声明变量来使变量成为全局变量

    var foo = "global";
    function bar() {
      var foo = "local";
    }
    

    应该注意的是,您不应该在最外层的范围内拥有任何代码。您应该将所有范围包装在匿名函数中,以便获得“模块级范围”。这意味着您拥有基于每个文件的顶级范围。这是模块模式的一部分。

答案 1 :(得分:4)

在浏览器的上下文中,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

答案 2 :(得分:0)

  

本地变量和私有变量有什么区别?在那儿   一个?

取决于使用它们的上下文。一般来说,它们的意思相同。从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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

私有变量仅在构造对象时才有意义。典型的原型模式允许您添加任何必要的变量和辅助函数作为对象实例和/或其原型的属性,但这样做的缺点是任何有权访问该对象的人都可以看到它们。为了避免这种情况,有一种替代模式,其中变量是构造函数的局部变量,所有方法都在构造函数范围内声明,只有公共方法被指定为对象的实际属性。

答案 5 :(得分:0)

我发现您的所有答案都很奇怪,我以为是:

    /* 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