资讯专栏INFORMATION COLUMN

[JS]《你不知道的Javascript·上》——函数作用域和块作用域

changfeng1050 / 820人阅读

摘要:提供了同时解决这两个问题的方案以上这种模式称为立即执行函数表达式。块作用域不应该完全作为函数作用域的替代方案,两种功能应该同时存在。

函数作用域

为了隐藏内部实现,可以通过在任意代码片段外部添加包装函数,但是这并不理想,因为必须声明一个具名函数,意味着这个函数名称本身会污染函数所在的作用域;同时必须通过显式地调用函数才能运行其中的代码。

*:区分函数声明和表达式最简单的方法是看function关键字出现在声明中的位置。如果function是声明中的第一个词,那么就是一个函数声明,否则就是一个函数表达式。

JS提供了同时解决这两个问题的方案:

var a=2;
(function foo(){
    var a=3;
    console.log(a);//3
})();

console.log(a);//2

以上这种模式称为立即执行函数表达式(IIFE)。

有一个改进的形式:

var a=2;
(function foo(){
    var a=3;
    console.log(a);//3
}());//调用的括号包含在用来包装的()里

console.log(a);//2

两种形式在功能上是一致的。

IIFE有一个进阶用法:把它们当作函数调用并传递参数进去。

var a=2;
(function IIFE(global){
    var a=3;
    console.log(a);//3
    console.log(global.a);//2
})(window);

console.log(a);//2

IIFE还有一种变化的用途是倒置代码的运行顺序,将需要运行的函数放在第二位。

var a=2;
(function IIFE(def){
    def(window);
})(funtion def(global){
    var a=3;
    console.log(a);//3
    console.log(global.a);//2
})
块作用域 let

只要声明是有效的,在声明中的任意位置都可以使用{...}括号来为let创建一个用于绑定的块。

var foo=true;
if(foo){
    {//显式的块
        let bar=foo*2;
        console.log(bar);//2
    }
     console.log(bar);//ReferenceError
}
console.log(bar);//ReferenceError

**:let循环:for的循环头部使用let,不仅将i绑定到for的块中,事实上它将其重新绑定到了循环的每个迭代中,确保使用上一个循环迭代结束时的值重新进行赋值。

*:块作用域不应该完全作为函数作用域的替代方案,两种功能应该同时存在。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/95830.html

相关文章

  • [JS]《你不知道Javascript·》——词法作用闭包

    摘要:吐槽一下,闭包这个词的翻译真是有很大的误解性啊要说闭包,要先说下词法作用域。闭包两个作用通过闭包,在外部环境访问内部环境的变量。闭包使得函数可以继续访问定义时的词法作用域。 闭包是真的让人头晕啊,看了很久还是觉得很模糊。只能把目前自己的一些理解先写下来,这其中必定包含着一些错误,待日后有更深刻的理解时再作更改。 吐槽一下,闭包这个词的翻译真是有很大的误解性啊…… 要说闭包,要先说下词法...

    guqiu 评论0 收藏0
  • 重读你不知道JS () 第一节三章

    摘要:如果是声明中的第一个词,那么就是一个函数声明,否则就是一个函数表达式。给函数表达式指定一个函数名可以有效的解决以上问题。始终给函数表达式命名是一个最佳实践。也有开发者干脆关闭了静态检查工具对重复变量名的检查。 你不知道的JS(上卷)笔记 你不知道的 JavaScript JavaScript 既是一门充满吸引力、简单易用的语言,又是一门具有许多复杂微妙技术的语言,即使是经验丰富的 Ja...

    lavor 评论0 收藏0
  • 你不知道 JavaScript 笔记——作用闭包

    摘要:理解作用域在引擎看来是两个完全不同的声明。在循环中使用闭包闭包是函数和声明该函数的词法环境的组合。回到我们上面说的在自己定义的作用域以外的地方执行,这里声明的是全局变量,使用全局变量不构成闭包。 第一章:作用域是什么 程序中变量存储在哪里,需要是怎么找到它,这就需要设计一套存储以及能方便的找到它的规则,这个规则就是作用域 编译原理 JavaScript 是一门编译语言,它与传统编译语言...

    BearyChat 评论0 收藏0
  • 你应该要知道作用闭包

    摘要:写在前面对于一个前端开发者,应该没有不知道作用域的。欺骗词法作用域有两个机制可以欺骗词法作用域和。关于你不知道的的第一部分作用域和闭包已经结束了,但是,更新不会就此止住未完待续 这是《你不知道的JavaScript》的第一部分。 本系列持续更新中,Github 地址请查阅这里。 写在前面 对于一个前端开发者,应该没有不知道作用域的。它是一个既简单有复杂的概念,简单到每行代码都有它的影子...

    JouyPub 评论0 收藏0
  • 重读你不知道JS () 第一节二章

    摘要:词法作用域定义在词法阶段的作用域由你在写代码时将变量和块作用域写在哪来决定的,因此当词法分析器处理代码时会保持作用域不变。欺骗词法作用域在词法分析器处理过后依然可以修改作用域。 你不知道的JS(上卷)笔记 你不知道的 JavaScript JavaScript 既是一门充满吸引力、简单易用的语言,又是一门具有许多复杂微妙技术的语言,即使是经验丰富的 JavaScript 开发者,如果没...

    baihe 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<