作用域-函数包围代码
选择最适合的作用域包含变量和函数
考虑一个函数传统的方式是 ,声明一个函数,在它内部添加代码。标题这里做了一个角度的切换:在编写代码外围包装一个函数说明,去“隐藏”这段代码。
我们看第一个代码片段:
function doSomething(a) {b = a + doSomethingElse( a * 2 );console.log( b * 3 );
}function doSomethingElse(a) {return a - 1;
}var b;doSomething( 2 ); // 15
复制代码
关注这里的变量b
和doSomethingElse
函数,很可能是doSomething
函数的"私有细节",允许外围的作用可访问不仅没必要而且可能是危险的。更加恰当的设计是将所有私有细节隐藏在doSomething
内部:
function doSomething(a) {function doSomethingElse(a) {return a - 1;}var b;b = a + doSomethingElse( a * 2 );console.log( b * 3 );
}doSomething( 2 ); // 15
复制代码
驱使做这样的代码隐藏,是一种成为“最低权限原则”的软件设计原则,也被称为“最低授权”或“最少曝光”,即仅暴露所需要的最低限度的东西。结合上个代码片段,结合函数包围代码这个主体,是用哪个作用域来包含变量和函数最适合的选择。
IIFE与函数包围代码
我们看第二个代码片段:
var a = 2;function foo() { // <-- 插入这个var a = 3;console.log( a ); // 3} // <-- 和这个
foo(); // <-- 还有这个console.log( a ); // 2
复制代码
在这段代码中,有函数包围代码的痕迹,foo
函数存在的意义只是保障内部变量a
的声明和a
的输出。但是额外引入了两个问题:
- 标识符名称
foo
污染了外部作用域 - 需要手动调用函数
foo
——foo()
IIFE——立即调用的函数表达式可以解决这个问题:
var a = 2;(function foo(){ // <-- 插入这个var a = 3;console.log( a ); // 3})(); // <-- 和这个console.log( a ); // 2
复制代码
标识符名称foo
仅存在于函数foo
内,且函数立即调用。
命名函数和匿名函数的比较
YDKJS-SCOPE CLOSURES-ch3 在讨论IIFE时候,引入了命名函数和匿名函数的比较,认为命名函数完胜,三条理由:
- 匿名函数在Call Stack没有名称表示,使调试更加困难
- 匿名函数情况下,只能接用废弃的
arguments.callee
调用自己 - 有个描述性的名称更可读
但架不住匿名函数方便阿,比如像arr#map
、arr#filter
等第一个参数传函数,使用箭头函数()=>{}
比较便利。所以我们来试着反驳这三条命名函数完胜的理由:
- 在Call Stack中一个是
(anonymous)
,一个是带名字的,但是debugger位置都是定位的,so...问题不是很大 - 无力反驳
- 第三点很容易理解,但是一个混乱的函数名字其实更难理解,so...
总结一下:如果函数需要在之后调用自己,使用命名函数,否则其实匿名函数更加方便;如果使用了命名函数,函数命名要讲究,找了找函数命名规范:
- 考虑使用前缀
动词 | 含义 | 返回值 |
---|---|---|
can | 判断是否可执行某个动作 ( 权限 ) | 函数返回一个布尔值。true:可执行;false:不可执行 |
has | 判断是否含有某个值 | 函数返回一个布尔值。true:含有此值;false:不含有此值 |
is | 判断是否为某个值 | 函数返回一个布尔值。true:为某个值;false:不为某个值 |
get | 获取某个值 | 函数返回一个非布尔值 |
set | 设置某个值 | 无返回值、返回是否设置成功或者返回链式对象 |
比如:
//是否可阅读
function canRead(){return true;
}//获取姓名
function getName{return this.name
}
复制代码
- 建议动宾结构——doSomething,比如 openFile、setName、addNumber
- 谨慎使用缩写,除非是hi约定成俗广泛使用的缩写,否则老老实实使用完整拼写
参考链接
YDKJS-SCOPE&CLOSURES-ch3
掘金-前端开发规范:命名规范...
掘金-谈谈函数的命名规范
转载于:https://juejin.im/post/5c5e8723e51d45015b4c945a
作用域-函数包围代码相关推荐
- 一文就懂Kotlin作用域函数以及object关键字
作用域函数 Kotlin 标准库包含几个函数,它们的唯一目的是在对象的上下文中执行代码块.当对一个对象调用这样的函数并提供一个 lambda 表达式时,它会形成一个临时作用域.在此作用域中,可以访问该 ...
- matlab 代码风格,10 Matlab 函数与代码风格
函数 函数,本质上是一种可复用的代码.现实生活中,有大量的工作都是重复的,变化的只是其中一小部分. 举个例子,假如要你计算 " 1+2+3+4+5+6+7+8+9+10 ",最简单 ...
- python全局变量的声明和使用_Python二级(07)——函数和代码复用
>>上一篇<Python二级(06)--程序的控制结构> 一.知识导图 二.函数的基本使用 1.函数的定义 I.函数是一段具有特定功能的.可重用的语句组,通 过函数名来表示和调 ...
- Kotlin学习笔记30 补充 作用域函数
参考链接 https://www.kotlincn.net/docs/reference/scope-functions.html 背景介绍 1.本节主要讲述几个Kotlin库提供的几个方便的方法 l ...
- kotlin作用域函数let run whith apply also 的区别takeIf 的用法
本质区别 有两个主要区别: 引用上下文对象的方式 this 和it 使用this则具备上下文,可以省略this 而it不能省略了,因为它是参数. 返回值 apply also返回上下文对象.let,r ...
- python函数增强代码可读性_如何提高代码的可读性 学习笔记
本文整理自 taowen 师傅在滴滴内部的分享. 1.Why 对一线开发人员来说,每天工作内容大多是在已有项目的基础上继续堆代码.当项目实在堆不动时就需要寻找收益来重构代码.既然我们的大多数时间都花在 ...
- 第 5 章 函数和代码复用
整理的文章内容主要来源为高教版<计算机等级考试二级 Python>教程视频讲义,并且更正了原讲义中的错误的地方. 专栏文章索引如下: 考试大纲 第 1 章 程序设计基本方法 第 2 章 P ...
- JS进阶 Day1 作用域 函数进阶 结构赋值(学习笔记)
1.作用域 1)局部作用域 函数作用域 注:函数执行完毕后,函数内部的变量实际被清空了 块级作用域 在js中使用{}包裹的代码称为代码块,代码块内部声明的变量外部将{有可能}无法访问 let声明的变量 ...
- 在python中对于函数定义代码的理解正确的理解是_Python 5 函数
一.判断题(共10小题,10分) 在Python中,自定义函数的关键字是def.(1分) A.对 B.错 参考答案: A 形参可以看做是函数内部的局部变量,函数运行结束之后形参就不可访问了.(1分) ...
最新文章
- python 上传文件夹,python – 使用Flask上传文件夹/文件
- 驾驶卡丁车 模拟,迷宫(女赛)
- Python(2.7.6) copy - 浅拷贝与深拷贝
- 单进程服务器(python版)
- python中协程与函数的区别_python协程和异步IO
- 【推荐算法】协同过滤算法——基于用户 Java实现
- 【Oracle】append
- Mybatis——动态SQL实现数据的增删改查
- 基于JAVA大数据在线考试系统在线阅卷系统及大数据统计分析计算机毕业设计源码+数据库+lw文档+系统+部署
- VBA字典(详解,示例)
- android之设置app背景图片
- HarmonyOS IoT首著,走进万物互联的世界!(附送书)
- array python lambda_Python 06 lambda函数
- java马斯京根法计算汇流系数P
- 关于有限元应力结果精度的几点讨论
- NI无线通信与射频技术学习资源汇总
- python0.618方法
- java开发电脑配置_新电脑java开发环境配置(自用)
- python操作Excel【openpy】
- MYSQL表的增删改查进阶(下)