JavaScript语言精粹(重读三)

接上篇函数返回

异常

try {
} catch(e) {
}

扩充类型的功能

有点像iOS中的分类

js允许给基本类型扩充功能。通过给Object的prototype添加方法,可以让该方法对所有对象起作用。这种方式可以给所有对象类型,比如函数、数组、字符串、数字。还有布尔值也适用。

Function.prototype.method = fucntion (name, func) {
    this.prototype[name] = func;
    return this;
}

这种方式一般用于一些添加一些公用的方法。

作用域

作用与控制着变量与参数的可见性及生命周期,减少了名称冲突以及提供自动内存管理。大多数语言和c一样有块级作用域。(在语句块一对花括号内,定义的所有变量在代码块外是不可见的,定义到在块中的变量会在代码块执行结束后释放掉)

但是在js中虽然语法貌似支持块级作用域,但是事实上是不支持的。js有函数作用域,意味着定义在函数中的参数对外部不可见,但是对函数内部任何地方都是可见的。

因为缺少块级作用域,所以做好的做法就是在函数体顶部声明所有可能用到的变量。

闭包

闭包就是能够读取其他函数内部变量的函数。

作用域的好处是可以访问定义在外部的变量(除了this和arguments)。

内部函数拥有比他外部函数更长的作用域

var myObject = (function (){
    var value = 0;
    return {
        increment: function (inc) {
            value += typeof inc === 'number' ?inc : 1;
        },
        getValue: funtion () {
            return value;
        }
    };
}());

函数返回一个包含两个方法的对象,并且这些方法可以访问value。

注意:理解内部函数能访问外部函数的实际变量而无需复制是很重要

两大作用:

  • 一个可以读取函数内部的变量,
  • 另一个就是让这些变量的值始终保持在内存中。

这部分知识比较多

学习Javascript闭包(Closure)

回调

常见场景就是异步请求网络中,为了防止假死状态。相关操作在异步回调中完成。

没有使用回调

request = prepare_the_request();
response = send_request_synchronously(request);
dispaly(response);

使用回调

send_request_asynchronously(request, function (response){
    display(response);
});

模块

模块是一个提供接口但却隐藏了状态与实现的函数或者对象。可以通过函数或者闭包来构造模块。通过函数产生模块基本可以完全避免由于全局变量所带来的糟糕的影响。

javascript中,Module模式用于进一步模拟类的概念,通过这种方式,可以使一个单独的对象拥有公有/私有方法和变量,从而屏蔽来自全局作用域的特殊部分。产生的结果是:函数名与在页面上其他脚本定义的函数冲突的可能性降低。

Module模式使用闭包封装”私有”状态和组织。它提供了一种包装混合公有/私有方法和变量的方式,防止其泄露至全局作用域,并与别的开发人员的接口发生冲突。通过该模式,只需返回一个公有API,而其他的一切都维持在私有闭包里面。

这样做为我们提供了一个屏蔽处理底层事件逻辑的整洁解决方案,同时只暴露一个接口供应用程序的其他部分使用。该模式除了返回一个对象而不是一个函数之外,非常类似于一个立即调用的函数表达式(IIFE)。

Javascript模式--模块模式

级联

其实就是iOS中布局库mansory的使用方式。这种方式有个比价牛逼的名字函数式编程

原理就是调用一个方法,方法返回值是this。然后有个一继续调用另一个方法。形如:

getElement("MyBoxDiv")
    .move(350, 150)
    .width(100)
    .height(100)
    .padding("4px")

柯里化

名词有点不懂:

柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接收余下的参数而且返回结果的新函数的技术。

在js中函数也是值,柯里化允许把函数以及传递给函数的参数结合一下,产生一个新的函数。

var add1 = add.curry(1);
document.writeln(add1(6));// 7

前端开发者进阶之函数柯里化Currying

记忆

函数可以将先前操作的结果记录子啊某个对象里面,从而避免无谓的重复运算。这种优化为记忆。js中的对象和数组要实现这种优化非常方便。

常见写法及时写一个对象保存在,在调用的时候先判断是否有值,如果有则跳过。

感觉这条并不是很有特别呀。为什么单独列出来。

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

推荐阅读更多精彩内容