ES5中的函数

1.在ES5中函数定义有两种方式:

函数声明: function functionName(arg){}

函数表达式:var functionName = function(arg){}

这两种方式定义的函数都可以使用,但是他们还是有一些区别的

1.函数声明方式定义的函数,会有函数声明提升的,即你可以在函数声明之前调用改函数,而函数表达式定义的函数不可以

2.匿名函数,匿名函数顾名思义就是其函数没有方法名字

function createCompareFunction(property){

return function (obj1,obj2){

var value1 = obj1[property];

var value2 = obj2[property];

if (value1 < value2){

return -1;

}else if (value1 > value2){

return 1;

}else{

return 0;

}

}

}

如上代码所示,createCompareFunction就会返回一个匿名函数

3 es5中的递归函数,可以使用arguments.callee(这个指向了当前正在执行的函数)来实现,避免函数表达式被赋值为其他,也可以使用命名函数表达式的方法

var factor = (function f (num){

if (num <=1){

return 1;

}else{

return num * f(num-1);

}

});

4.函数自执行

(function (name){

console.log(name);

}('xindi'));

如下实现,这个匿名函数会马上执行

5.闭包

闭包是指能有权访问另一个函数作用域中的变量的函数.

闭包在执行的时候,会使用arguments和其他的命名参数创建自己的活动对象,闭包的作用域链中会包含外部函数的活动对象,当在函数中访问一个变量时,就会从其作用域链中搜索直到找到为止.所以这就是闭包为什么可以访问其外部函数的变量.

ps:this对象和arguments对象只会搜索自己的活动对象,不会去访问外部函数的活动对象.

但是闭包作用域链中保存的是整个的活动对象,而不是某个特殊的变量,所以当闭包执行之后你可能得到的并不是你想要的结果,例如

function createFunctions (){

var newArr = new Array();

for (var i = 0;i<10;i++) {

newArr[i] = function (){

return i

}

}

return newArr;

}

createFunctions().map(function(item){

let result = item();

console.log(result);

});

这个例子中item就是闭包,每个item都都包含了createFunctions的活动对象,但其实每个item引用的都是同一个活动对象.当createFunctions执行完毕之后createFunctions内部的变量I值为10,此时item(闭包)包含的活动对象中I的值也是10.所以得到的结果会都是10;

当然我们也可以采用其他的方式来避免这种情况,如果一定要使用闭包的话,可以采取下面的方式:

function createFunctions (){

var newArr = new Array();

for (var i = 0;i<10;i++) {

newArr[i] = function (num){

return function(){

return num;

}

}(i)

}

return newArr;

}

createFunctions().map(function(item){

let result = item();

console.log(result);

});

这个方式我们采取自执行函数,让闭包返回的变量i的副本.

在闭包中我们还需要关注另一个问题就是this对象和arguments对象.this和arguments对象只会在本身的活动对象去寻找,所以当有闭包的时候,闭包内部访问的this和arguments对象可能不是你想要的.

我们可以有以下几种解决方案:

1.将this和arguments对象用另一个变量保存下来,在闭包内部访问你保存的那个对象

2.借用bind函数,创建一个this对象为你传入的新函数.

3.借用call 或 apply 改变闭包内部的执行环境

6.es5中模仿块级作用域的变量,在es6中,实现let 和const两个块级作用域的变量,但是在es5中只有var,var声明的作用域是非块级的.不过我们可以使用闭包来模仿此行为

(function(){

var i = 0;

}())

如上所示,我们声明了一个匿名的自执行函数,这样在这个函数内部的变量都会只在此函数内部生效,类似块级的变量.

7.私有变量,严格意义上来说在js中并不存在私有变量,但是我们可以通过不同的方式来实现类似私有变量

1.特权方法:

function Person(){

var priviteVar = 10;

function privateFunc (){

console.log(priviteVar);

return 'lsh';

}

this.publicFunc = function(){

priviteVar += 1;

return privateFunc();

}

}

这样实现的结果就是priviteVar 和privateFunc都只能通过publicFunc来访问

2.静态私有变量:

(function(){

var priviteVar = 10;

function privateFunc(){

priviteVar += 1;

return 'lsh'+priviteVar;

}

Person = function (name){

this.name = name;

}

Person.prototype.publicFunc = function (){

return privateFunc();

}

}())

上面的实现,构造函数和priviteVar都处于同一个函数环境下,这样priviteVar就会成为一个静态变量,也就是你调用构造函数创建多个对象,其仍然共享同一个priviteVar.

8.模块模式

有时候程序中我们会需要一个单利对象来管理程序的一些信息,同时这个单利对象我们可能需要有它的私有变量,那么我们可以使用模块模式来实现

var single = function (){

var privateVar = 10;

function privateFunc (){

return 'lsh';

}

var obj = new Object();

obj.publicProperty = false;

obj.publicFunc = function (){

privateVar += 1;

return privateFunc();

}

return obj;

}

这样我们可以得到一个单利对象,同时这个对象有自己的私有方法和属性,也有着公有方法和属性;

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

推荐阅读更多精彩内容

  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,783评论 0 38
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,145评论 0 13
  • 继承 一、混入式继承 二、原型继承 利用原型中的成员可以被和其相关的对象共享这一特性,可以实现继承,这种实现继承的...
    magic_pill阅读 1,061评论 0 3
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,750评论 2 17
  • 第一种情况: 处理办法: B通过Intent启动C后,添加一句代码:B.this.finish(); Intent...
    底层码农阅读 749评论 0 5