南充网络公司_南充网站建设|南充网站设计|南充网站制作|南充网页设计|南充网页制作|南充网页开发|南充网页建设|南充网络公司|南充软件开发【南充北湖网络科技公司官方网站】

JavaScript变量作用域(Variable Scope)和闭包(closure)的基础知识

2015-5-12 16:35| 发布者: aibeihu| 查看: 1784| 评论: 0

摘要:  在这篇文章中,我会试图讲解JavaScript变量的作用域和声明提升,以及许多隐隐藏的陷阱。为了确保我们不会碰到不可预见的问题,我们必须真正理解这些概念。  基本定义  作用范围是个“木桶”,里面装着变量。变 ...

 在这篇文章中,我会试图讲解JavaScript变量的作用域和声明提升,以及许多隐隐藏的陷阱。为了确保我们不会碰到不可预见的问题,我们必须真正理解这些概念。

  基本定义

  作用范围是个“木桶”,里面装着变量。变量可以是局部或者全局性的,但在子范围中定义的变量是可以访问父范围的,这一点可能会造成一些困扰。

  在JavaScript中使用"var"关键字声明变量。一旦在父范围宣声明,就会作为各自子范围的一部分。即在本地范围内有效,但本地定义的变量不可在全局范围内访问。

  让我们来看一个例子。执行下面的代码,你会发现,你能打印出全局范围定义的变量,而全局范围无法访问局部范围定义的变量。

1
2
3
4
5
6
7
var agloballydefinedvariable = 'Global';
function someFunction() {
  var alocallydefinedvariable = 'Local';
  console.log(agloballydefinedvariable); // Global
}
console.log(alocallydefinedvariable);
// Uncaught ReferenceError: alocallydefinedvariable is not defined

  作用域链(Scope Chain)

  如果你忘记使用“var”的关键字来定义局部变量,事情可能会变得非常糟糕。为什么会这样呢?因为JavaScript会首先在父作用域内搜索一个未定义的变量,然后再到全局范围进行搜索。在下面的例子中,JavaScript知道变量“a”是someFunction()的一个局部变量,在anotherFunction()中它会寻找它父作用域内的变量。

1
2
3
4
5
6
7
var a = 1;
function someFunction() {
  var a = 2;
  function anotherFunction() {
    console.log(a); // 2
  }
}

  更复杂的情况是,在下面的例子中,一个变量没有在函数中进行作用域的限定。

  在someFunction()中调用了一个没有在函数范围内定义的变量 a=2; 这个分配将覆盖全局变量的值。

  后续引用将指向全局变量的值。


鲜花

握手

雷人

路过

鸡蛋

相关分类

发布主题 官方QQ群
 
 
技术支持
在线客服
北湖网络交流群:
北湖网络
工作时间:
8:00-18:00
 

Powered by Discuz! X3.2 --© 20011-2015 南充北湖网络有限公司,all rights reserved 技术支持:北湖网络

Archiver  |  手机版  |  小黑屋  |  南充北湖网络有限公司 ( 蜀ICP备14003946号