全局、本地和私有函数 (Javascript)

Posted

技术标签:

【中文标题】全局、本地和私有函数 (Javascript)【英文标题】:Global and Local and Private Functions (Javascript) 【发布时间】:2012-03-06 06:10:00 【问题描述】:

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

    局部变量和私有变量有什么区别?有吗?

    如何使变量成为全局变量或局部变量,他们说过要在其前面加上'var =',但非常模糊。

【问题讨论】:

你可能想看看***.com/questions/500431/javascript-variable-scope 【参考方案1】:

在浏览器上下文中,var 关键字将变量范围限定为当前函数的范围。

var a = 10;

var b = function(a) 
   console.log(a);  # 15


b(15);
console.log(a);  # 10

如果你不包含 var 关键字,它会被分配到 window 的范围并且被认为是全局的。除非您有充分的理由将其排除,否则请始终包含 var 关键字。

如果变量只存在于函数范围内,则认为它是私有的。这通常采用匿名函数的形式。这实际上不是术语常识中的私有变量,它只是一个局部变量。

(function() 
  var x = 10;
)();

console.log(x); #undefined

【讨论】:

你对私有的定义很差。变量永远不是私有的。 @Raynos This is not actually a private variable in the common sense of the term, it is simply a local variable. ...或者避免使用 CoffeeScript。 :-)【参考方案2】:

    没有,人们使用“私人”是因为他们弄错了,意思是说“本地”

    局部变量定义为

var foo = "local";

全局变量是全局作用域对象的一个​​属性(在浏览器中是window

window.foo = "global";

您可以在不首先使用var foo 声明变量 foo 的情况下执行foo = "global"; 的事实是一个“错误”。这在 ES5 严格模式下已修复。

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

ReferenceError: foo is not defined

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

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

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

【讨论】:

【参考方案3】:

局部变量和私有变量有什么区别?有没有 一个?

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

【讨论】:

【参考方案4】:

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

【讨论】:

alert(local); 抛出 ReferenceError【参考方案5】:

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

【讨论】:

【参考方案6】:

我觉得你所有的答案都很奇怪,因为我认为它如下:

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

【讨论】:

以上是关于全局、本地和私有函数 (Javascript)的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript闭包

javascript 闭包解析

JavaScript面试题总结系列

JavaScript 闭包

将全局内存用于(大)本地/私有温度。 OpenCL 中高效的数据结构

JavaScript全解析——this指向