Fork me on GitHub

【Javascript系列】变量作用域

问题描述

 本篇文章主要讲解javascript变量及其作用域。

1   内容区

在js中,变量大致可分为全局变量(全局作用域)和局部变量(局部作用域);

用关键字var定义变量(全局变量,可以省略var关键字,但局部变量不建议这么做,否则容易造成全局变量被覆盖或者重写)

 1.1   变量声明

当只是声明变量,但未给变量赋值时,则默认值为undefined

fucntion f(){
    var varParam;
    console.log(varParam);//undefined
}

f();

1.2  当全局变量与局部变量重名时,局部变量覆盖全局变量

var  Scrope="Global  Scrope";//全局变量
function f(){ 
var Scrope="Local Scrope";//局部变量
console.log(Scrope);//Local Scrope
}

 1.3  局部变量省略var,造成全局变量被覆盖

var  Scrope="Global  Scrope";//全局变量
function f(){ 
   Scrope="Local Scrope";//局部变量定义省略var关键字,造成覆盖全局变量内容(重写全局变量)
   console.log(Scrope);//Local Scrope 
}

1.4  作用域嵌套

var scope="global scope";//全局变量
function checkscope(){
   var scope="local scope";//局部变量
   function nested(){
       var scope="nested scope";//嵌套作用域的局部变量
       return scope;//返回当前作用域的值
   }
   return nested();
}

checkscope()

 1.5  函数作用域

 在一些类似c语言的编程语言中,花括号内的每一段代码都具有各自的作用域,而且变量在声明它们的代码之外是不可见的,我们称之为块级作用域(block scope),但JavaScript中没有块级作用域,用函数作用域(function scope)代替。

JavaScript的函数作用域是指在函数内声明的所有变量在函数体内始终是可见的。

function test(o){
     var i=0;//i在整个函数体内均是有定义的
     if(typeof 0=="object"){
         var j=0;//j在函数体内是有定义的,不仅仅是在这个代码段内
         for(var k=0;k<10;k++){//k在函数体内是有定义的,不仅仅是在循环体内
                  console.log(k);//输出0~9
          }
           console.log(k);//k已经定义了,输出10
       }
       console.log(j);//j已经定义了,但可能没初始化
}

 1.6  变量声明提前

由于JavaScript中,函数内声明的所有变量在函数体内始终是可见的,这意味着变量在声明前甚至已经可用,这个特性被非正式地称为声明提前(hoisting),即JavaScript函数里的声明的所有变量(但不涉及赋值)都被“提前”至函数体的顶部。

1 var scope="gloabal";
2 function f(){
3      console.log(scope);//输出“undefined“,而不是”global”
4      var scope="local";//变量在这里赋初始值,但变量本身在函数体内任何地方均是有定义的
5      console.log(scope);//输出“local”
6 }

如上代码等价于如下代码

 var scope="gloabal";
 function f(){
     var scope;//在函数顶部声明了局部变量,覆盖了全局变量
     console.log(scope);//变量存在,其值是 undefined
     scope="local";//将变量初始化,并赋值
      console.log(scope);//输出“local”
 }

1.7  在函数内定义全局变量

//全局变量
function AllVary() {
     n = 10  //表示全部变量,外部可访问
}
PartVary();
alert(n);//10

错误的定义

//全局变量
function AllVary() {
    var  n = 10  //表示全部变量,外部可访问
}
PartVary();
alert(n);//error

1.8  作为属性的变量

待续。。。。

1.9  作用域链

待续。。。。

2  参考文献

 

【01】《JavaScript权威指南》(第六版)  (美)David.Flanagan

3  版权区

 

 

  • 感谢您的阅读,若有不足之处,欢迎指教,共同学习、共同进步。
  • 博主网址:http://www.cnblogs.com/wangjiming/。
  • 极少部分文章利用读书、参考、引用、抄袭、复制和粘贴等多种方式整合而成的,大部分为原创。
  • 如您喜欢,麻烦推荐一下;如您有新想法,欢迎提出,邮箱:2016177728@qq.com。
  • 可以转载该博客,但必须著名博客来源。
posted @ 2016-11-27 01:36  Alan_beijing  阅读(1363)  评论(0编辑  收藏  举报