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

问题描述 投票:7回答:6

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

  1. 本地变量和私有变量有什么区别?有吗?
  2. 如何将变量设为全局变量或局部变量,他们说过将'var ='放在它之前,但它非常模糊。
javascript function global-variables local private
6个回答
8
投票
  1. 没有,人们使用“私人”,因为他们错了,并且意味着说“本地”
  2. 局部变量定义为

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";
}

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


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

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

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

0
投票

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


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
© www.soinside.com 2019 - 2024. All rights reserved.