作用域-函数包围代码

栏目: JavaScript · 发布时间: 5年前

内容简介:考虑一个函数传统的方式是 ,声明一个函数,在它内部添加代码。标题这里做了一个角度的切换:在编写代码外围包装一个函数说明,去“隐藏”这段代码。我们看第一个代码片段:关注这里的变量

考虑一个函数传统的方式是 ,声明一个函数,在它内部添加代码。标题这里做了一个角度的切换:在编写代码外围包装一个函数说明,去“隐藏”这段代码。

我们看第一个代码片段:

function doSomething(a) {
	b = a + doSomethingElse( a * 2 );

	console.log( b * 3 );
}

function doSomethingElse(a) {
	return a - 1;
}

var b;

doSomething( 2 ); // 15
复制代码

关注这里的变量 bdoSomethingElse 函数,很可能是 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 的输出。但是额外引入了两个问题:

  1. 标识符名称 foo 污染了外部作用域
  2. 需要手动调用函数 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时候,引入了命名函数和匿名函数的比较,认为命名函数完胜,三条理由:

arguments.callee

但架不住匿名函数方便阿,比如像 arr#maparr#filter 等第一个参数传函数,使用箭头函数 ()=>{} 比较便利。所以我们来试着反驳这三条命名函数完胜的理由:

(anonymous)

总结一下:如果函数需要在之后调用自己,使用命名函数,否则其实匿名函数更加方便;如果使用了命名函数,函数命名要讲究,找了找 函数命名规范

  1. 考虑使用前缀
动词 含义 返回值
can 判断是否可执行某个动作 ( 权限 ) 函数返回一个布尔值。true:可执行;false:不可执行
has 判断是否含有某个值 函数返回一个布尔值。true:含有此值;false:不含有此值
is 判断是否为某个值 函数返回一个布尔值。true:为某个值;false:不为某个值
get 获取某个值 函数返回一个非布尔值
set 设置某个值 无返回值、返回是否设置成功或者返回链式对象

比如:

//是否可阅读
function canRead(){
    return true;
}

//获取姓名
function getName{
    return this.name
}
复制代码
  1. 建议动宾结构——doSomething,比如 openFile、setName、addNumber
  2. 谨慎使用缩写,除非是hi约定成俗广泛使用的缩写,否则老老实实使用完整拼写

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

高等应用数学问题的MATLAB求解

高等应用数学问题的MATLAB求解

薛定宇、陈阳泉 / 清华大学出版社 / 2008-10 / 49.00元

薛定宇和陈阳泉编著的《高等应用数学问题的MATLAB求解》首先介绍了MATLAB语言程序设计的基本内容,在此基础上系统介绍了各个应用数学领域的问题求解,如基于MATLAB的微积分问题、线性代数问题的计算机求解、积分变换和复变函数问题、非线性方程与最优化问题、常微分方程与偏微分方程问题、数据插值与函数逼近问题、概率论与数理统计问题的解析解和数值解法等,还介绍了较新的非传统方法,如模糊逻辑与模糊推理、......一起来看看 《高等应用数学问题的MATLAB求解》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具