4

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

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();

那么什么是作用域?这是这里的摘录和我的评论:

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

编辑:

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

4

5 回答 5

1

我将假设您知道计算机科学中的范围。如果没有,请阅读wiki 页面

在 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,你不能从外部调用它。

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

于 2013-08-22T17:53:09.213 回答
1

范围是变量处于活动状态的区域。就像一个函数或一个页面。

global_var 和 f 对页面来说是全局的,因为它们在所有函数之外,所以它们对所有函数都可用。

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

于 2013-08-22T17:22:40.680 回答
0

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

但是本地范围并不意味着您不能访问其范围之外的任何变量。如下closure图所示,这是一个简单的闭包示例:

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

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

function在 JavaScript 中, a和 a 的声明之间有一个区别variable

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

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);
    } 
}
于 2013-08-22T17:43:51.420 回答
0

我想我在这里找到了答案:

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

于 2013-08-22T17:45:10.613 回答
0

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

取自关于变量范围的 MSDN 页面。阅读!

于 2013-08-22T17:23:49.037 回答