作用域

我所理解的作用域,就像一个套一个的盒子;你在哪个盒子里,要么伸手拿自己盒子里的东西,要么从包裹你的盒子里拿东西;要想到你下面的盒子里去拿东西,是不被允许的。

// 首先,定义自己的log函数
const log = function() {
        console.log.apply(console, arguments)
}

作用域,也称为运行环境。对于JS,运行在web浏览器上时,浏览器为其提供一个运行环境;而NodeJS也是为JS代码的执行提供了一个运行环境。

作用域有大小之分,大的称为全局作用域,小的称为局部作用域,再小的称为块级作用域;相对应的作用域中的变量,则称为全局变量局部变量;暂时没听到块级变量这么一说。

作用域的大小之分,并不是为了比较谁大谁小;其不是相互独立的,可以理解成包含被包含关系。局部作用域块级作用域一定是包含在全局作用域之内;局部作用域之间可能有包含被包含的关系,也可能是彼此独立的;而块级作用域局部作用域类似。

全局作用域 -- 全局变量

一个变量因其所在作用域的不同,能够被访问的限制也是不同的;在局部作用域中,只能访问自己作用域内定义的变量,以及向上访问包含自己的父级作用域,或者延长的作用域。在全局作用域内定义一个全局变量,在整个环境中都可以访问的到,无论是是局部作用域中,还是在块级作用域中。比如:

// 例子1

// 定义全局变量i
var i = 0
// 在 局部作用域 中访问全局变量
const showme = function() {
    log(i)
}
showme()                // 0

// 在 块级作用域 中访问全局变量
for(; i < 2; i++) {
    log(i)              // 0 1
}

JS语句执行时,会先在当前自己的作用域中搜索变量,如上例中的i;当在当前作用域中找不到的时候,会向上层去查找。在这里就是直接到全局作用域中找到了变量i

局部作用域 -- 局部变量

全局变量之下的变量,有局部和块级两个,不分上下级,只因声明的区域不同。局部变量一般是声明在函数内部,如上例中的showme函数。一个函数的定义,就定义了一个局部作用域,其内声明的变量则只在这个作用域、及其下层作用域可以被访问的到。

// 例子2

// color为全局变量,在函数内部也可以访问
var color = 'blue'

var changeColor = function() {
    // 注意:当变量不用var声明时,是一个全局变量,尽量不要这样使用

    // anothorColor为changeColor函数内部变量,不能被外部所访问
    var anothorColor = 'red'

    var swapColor = function() {
        // tempColor与anothorColor类似,是swapColor函数内部变量,不能被外层访问到
        var tempColor = anothorColor
        // 当访问anothorColor时,会先从本函数内部寻找,找不到,会到上层changeColor()寻找
        anothorColor = color
        // 当访问color时,在本层寻找不到,会逐级向上直到全局作用域
        color = tempColor
    }
    return swapColor
}

// 由于anothorColor tempColor属于局部作用域中的局部变量,在全局环境中无法访问
log(anothorColor)           // Uncaught ReferenceError: anothorColor is not defined
log(tempColor)              // Uncaught ReferenceError: tempColor is not defined

// 调用changeColor()函数,获得swapColor()函数的引用
var swapColor = changeColor()
// 调用swapColor函数
swapColor()                              // "red"
// 上面两条语句合并为一条: changeColor()()

如上代码,一个全局变量color,其后由changColor函数定义了一个局部作用域A;而在changColor的局部作用域A之内,又由swapColor函数定义了一个层级更低的局部作用域B。在局部作用域中可以看到,变量的访问是一层一层逐级往上层查找的;找到了就结束查询;一直到全局作用于中都没有找到,则报错。

块级作用域 -- 块级变量

其实没有块级变量,是我自己喊的,方便称呼块级作用域中声明的变量。块级变量也是一个局部变量,但其不是在函数定义的局部作用域中;而是存在于由大括号{}(或for()圆括号)包裹的块级作用域中。块级作用域可以看作比局部变量更小的作用域;其访问的限制也是一样的,只可向上访问,不能向下访问。如例子1中的变量i
既然一样,为什么还要有个块级作用域呢?块级作用域的存在确实方便了我们的代码编写,也帮我们避免了一些不小心的错误。如下:

// 例子3    ES6新增块级作用域,使用let声明变量

// 以前
if(2 == '2') {
    var i = 10
}
log(i)                  //10

// ES6
if(2 == '2') {
    let j = 10
}
log(j)                  // Uncaught ReferenceError: j is not defined

// 尤其for循环
for(var j = 0; j < 2; j++) {
    log(j)              // 0 1
}
log(j)                  // 2

// ES6
for (let k = 0; k < 2; k++) {
    log(k)              // 0 1
}
log(k)                  // VM473:4 Uncaught ReferenceError: k is not defined

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容