我不明白范围是什么。我在某处读过范围是访问变量的方法。但是我发现很难想出一个变量可通过范围访问的情况。函数内的所有变量都可以通过“全局”或“激活/变量”对象的上下文或通过闭包来访问。以下是用来演示我的意思的代码:
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
编辑:
感谢大家。我想我必须从变量和函数的角度来看范围。
答案 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中,声明function
和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);
}
}
答案 4 :(得分:0)
我想我找到了答案here:
当创建执行上下文时,会按照定义的顺序发生许多事情
...
接下来,为执行上下文分配一个SCOPE。范围由对象的列表(或链)组成。每个函数对象都有一个内部[[scope]]属性(我们将在稍后详细介绍),它还包含一个对象列表(或链)。分配给函数调用的执行上下文的作用域包含相应函数对象的[[scope]]属性引用的列表,其中Activation对象添加在链的前面(或列表的顶部) )。