Javascript的范围是什么?

时间:2013-08-22 17:19:23

标签: javascript

我不明白范围是什么。我在某处读过范围是访问变量的方法。但是我发现很难想出一个变量可通过范围访问的情况。函数内的所有变量都可以通过“全局”或“激活/变量”对象的上下文或通过闭包来访问。以下是用来演示我的意思的代码:

var global_var = 7;
var f = (function() {
    var closure_var = 5;
    return function() {
        var local_var = 3;
        alert(local_var);  // alerts 3  - visible through context as Activation Object's property
        alert(closure_var); // alerts 5  - visible through closure
        alert(global_var); // alerts 7  - visible through context as Global Object's property
        alert(this.global_var); // alerts 7  - visible through context as Global Object's property
    }
})();
f();

那么范围是什么? 以下是here的摘录和我的评论:

// a globally-scoped variable
var a=1;

// global scope
function one(){
    alert(a); 
}
// no, it's accessible as global object's context

// local scope
function two(a){
    alert(a);
}
// no, it's accessible as activation object's context

编辑:

感谢大家。我想我必须从变量和函数的角度来看范围。

5 个答案:

答案 0 :(得分:1)

范围是变量处于活动状态的区域。像功能或页面一样。

global_var和f是页面的全局,因为它们不在所有函数中,所以它们可用于所有函数。

local_var是函数f()的局部变量,因此在函数f()之外不可用。

答案 1 :(得分:1)

我将假设你知道计算机科学的范围是什么。如果没有,请阅读wiki page

在javascript中,每个函数都有一个范围。此外,还有一个全局范围(在任何函数外部,在全局范围内定义已定义的变量,或者在定义中不在var之前的函数中定义)。范围是分层次的。如果在F中有函数F和函数G,当试图访问G中的变量时,它将检查变量是否在G范围中定义。如果不是,它将在F范围内尝试。如果没有,它将在全球范围内尝试。

// global scope
var a = 1;

function F() {
    var a = 2;

    function G() {
        var a = 3;

        // here, a is 3
    }

    // here, a is 2
}

// here, a is 1

所有3个变量都不同(因为它们是用var定义的),您可以在F或G中更改全局范围。

// global scope
var a = 1;

function F() {
    a = 2;

    function G() {
        a = 3;

        // here, a is 3
    }

    // G is called, a is changed..
    G();

    // here, a is 3
}
// F is called, a is changed..
F();

// here, a is 3

所有3个变量实际上都是一个,可以在任何地方访问(因为它在全局范围内)。更改将影响所有3个范围。

// global scope
var a = 1;

function F() {
    a = 2;

    function G() {
       var a = 3;

        // here, a is 3
    }

    // here, a is 2
}

// here, a is 1

由于在a中定义了G,因此在其范围内它与外界不同并且隔离。意思是,G之外的任何内容都无法访问或更改内部的变量a。他们只会从全局范围看到a(如果已定义)。同样由于函数范围行为,G函数仅存在于F内,您无法从外部调用它。

将范围视为容器。它们可以嵌套。你无法向内看,但他们可以向外看。

答案 2 :(得分:0)

JavaScript有两个范围:全局和本地。在函数定义之外声明的变量是全局变量,其值可在整个程序中访问和修改。在函数定义中声明的变量是本地的。每次执行函数时都会创建和销毁它,并且函数外部的任何代码都无法访问它。

从MSDN页面获取有关变量范围的信息。 READ IT!

答案 3 :(得分:0)

您可以直接访问任何变量的区域称为其本地范围。在所有函数之外声明的任何变量都在全局范围内。 因此,非常简单的局部范围是可以直接访问变量的区域。

本地范围并不意味着您无法访问其范围之外的任何变量。这里closure出现了,这是一个简单的闭包示例:

function a () {
    var q = 10; 
    return function () {
        alert(q++)
    }
}
var b = a();  // returns a function for which var q is local

现在每次通过b()调用b时,var q都会递增。

在JavaScript中,声明functionvariable之间存在一个差异。

您可以在声明范围内的任何位置访问函数,但只能在声明变量的位置之后访问变量。 这是一个例子:

function ab() { 
    t();   // alert 1
    alert(a1);    // alert undefined
    var a1 = 1000; // Now declare a1
    alert(a1);    // alert 1000
    function t() {  // define function
        alert(1);
    } 
}

答案 4 :(得分:0)

我想我找到了答案here

当创建执行上下文时,会按照定义的顺序发生许多事情 ...
接下来,为执行上下文分配一个SCOPE。范围由对象的列表(或链)组成。每个函数对象都有一个内部[[scope]]属性(我们将在稍后详细介绍),它还包含一个对象列表(或链)。分配给函数调用的执行上下文的作用域包含相应函数对象的[[scope]]属性引用的列表,其中Activation对象添加在链的前面(或列表的顶部) )。