JavaScript变量的做用域

    虽然《JavaScript权威指南》这本书很好,可是有一些东西让人容易理解错。最近在恶补基础,结合这本书,我想把变量的做用域从新梳理一下:java

    "一个变量的做用域(scope)是程序源代码中定义这个变量的区域。全局变量拥有全局做用域,在JavaScript代码中的任何地方都是有定义的。然而在函数内声明的变量只在函数体内有定义。"----摘自《JavaScript权威指南》第6版es6


     "在一些相似C语言的编程语言中,花括号内的每一段代码都具备各自的做用域,并且变量在声明他们的代码段以外是不可见的,咱们称之为块级做用域。"----摘自《JavaScript权威指南》第6版编程


    在ECMAScript 6以前是没有块级做用域的,这里说的是ECMAScript5.1规范标准。闭包

    变量分全局变量,局部变量。这就决定了变量的做用域:全局做用域、与函数做用域编程语言

demo1:函数

var scope = "global"; //声明一个全局变量
function check() {    
    var scope = "local";    //声明一个同名的局部变量
    return scope;        //返回局部变量的值,而不是全局变量的值
}
check();        => "local"

解:spa

    " 在函数体内,局部变量的优先级高于同名的全局变量。若是在函数内声明的一个局部变量or函数参数中带有的变量和全局变量重名,那么全局变量就会被局部变量所遮盖。"----摘自《JavaScript权威指南》第6版code

实践证实:orm

var scope = "global"; //声明一个全局变量
function check() {    
    var scope = "local";    //声明一个同名的局部变量
    return scope;        //返回局部变量的值,而不是全局变量的值
}
check();        => "local"
console.log(scope);      =>"blobal"

    书上的话容易误导人,不少人一开始把这里的"遮盖"当成了覆盖,想固然认为全局变量scope的值变成了"local",实则否则。 在函数体内,局部变量的优先级高于同名的全局变量。其实check函数返回就是局部变量scope,而不是全局变scope;二者只是同名而已。
对象


demo2:

scope = "global"; //声明一个全局变量,不使用var声明
function t() {    
    scope = "local";    //修改了全局变量
    myscope = "local;    //声明一个新的全局变量
    return [scope,myscope];        //返回两个值
}
t();        scope => "local"    myscope => "local" //二者都为 "local"

解:

    在js中,若是给一个没有声明的变量赋值,都是全局变量,并且是全局对象的属性。


demo3:

var scope="global";  //声明一个全局变量
function t(){  
    console.log(scope);  
    var scope="local"  
    console.log(scope);  
}  
t();     scope => 第一次为 undefined      第二次才为 "local"

解:

       不少人勿认为第一次打印的是全局变量,其实否则。 js函数做用域:指在函数内声明的全部变量在函数体内始终是可见的。有意思的是,这意味着变量在声明以前甚至已经可用。js这个特性被非正式地成为声明提早。即:js函数里声明的全部变量都(不涉及赋值)被“提早”到函数体的顶部。

    上述过程等价:将函数内的变量声明“提早”至函数体顶部,变量初始化留在原来的位置。等价于以下的代码:

var scope="global";  //声明一个全局变量
function t(){  
    var scope;    //顶部声明了局部变量
    console.log(scope);  //变量存在,但未初始化
    scope="local"     //初始化并赋值
    console.log(scope);  
}  
t();


函数内声明的变量都是局部变量,函数外是没法访问的,外部想要访问函数内的变量能够采用闭包来实现,代码实例以下:

demo4:

function t (){
    var x=10;
    return function () {
        return x;
    }
}
console.log(x);    //报错,x未定义
var a = t();
console.log(a());    //10


在js编写当中,因为规范太少,写法灵活,可能致使出现各类bug。声明变量时,最好放在函数体顶部,增长易读性。

es6中,增长了不少特性,js的规范愈来愈标准化,已成为一门通吃各个平台的语言,加油!

相关文章
相关标签/搜索