函数表达式,什么概念,表达式中的函数表达式。

1 函数申明

function 函数名([函数参数]){

  //函数体

}

js中无论像这样的显示函数什么放在调用之前还是调用之后,都不影响使用,因为js解释引擎会将函数声明提前化,这点很好理解;

2 函数表达式

var functionV=function 函数名([函数参数]){

  //函数体

};

这种方式的一个变量指向了一个函数,仅此而已。js引擎只会把他当作一个函数类型的变量来处理,仅此而已。

3 递归调用

我们知道函数名仅仅是指向函数的指针,那么话外之意,这个函数名可以指向其他变量,也可以为null等等;

function sum(n){return n+sum(n-1);}

这里如果使用函数表达式,那么就会出问题了,来看怎么回事:

var anSum=sum;

sum=null;

anSum(10);//这个时候调用,进行递归的时候其内部还是使用sum指针,但是,但是此时sum已经被改变,导致调用发生异常,这当然不是程序员想看到的结果?怎么办

在函数章节已经知道函数包括几个属性,name,length,arguments,prototype等等,其中arguments又包含一个指向函数的指针变量callee,就代表了函数本身,且callee为只读,所以我们应该这样写递归代码

function sum(n){return n+arguments.callee(n-1);}

4 模仿块级作用域

js中很容易就创建一堆寄宿在window对象下的变量,函数等等,虽然js不说,但这些对象没人管没人问,他就是window在默默管理着,在一个引用很多js文件页面中难免遇到变量函数命名冲突导致覆盖或者不稳定等各种莫名其妙的问题,那么就需要一种机制来使得js代码模块化,变量,函数也模块化,对于外部window这个对象尽量少向他释放一些全局变量,和函数,特别是毫无意义的。这里的机制需要对外部来说是访问不了内部变量很函数,而对于函数内部而言外部的都是公开的都是可以访问的,就好比家庭和公共资源一样的道理。

js中怎样实现模块化的作用域呢?

(function 函数名(){})();//自动调用的函数,像这样申明的函数会自动调用,这样也具有闭合封装的作用域,这种模块化的书写方式其实就是闭包的一种体现,其内部非构造函数定义的变量和函数被称为静态变量

和函数

5 静态变量和函数

(function(){

  //静态变量--------通过特殊方法来访问,对于实例对象来说均共享

  var a=1;

  //静态函数-----被实例对象共享

  function sayHell(){console.log('0000)};

  //申明模块对象

  var module=function(){};

  

//通过特权方法向外暴露

  module.prototype.Accessa=function(){return a;};

  module.prototype.AccessMethodSayhell=function(){return sayHell;};

})();

6 私有变量与方法

(function 函数名(){

//在构造函数内部定义的

  //私有变量--------通过特殊方法来访问

  var a=1;

  //私有函数-----

  function sayHell(){console.log('0000)};

//通过this指向的这叫公有变量

  this.name='';

})();

7 模块模式

模块模式又称为单例模式,一般来说js中单例都是使用字面量来实现;

var obj={

  name:'',

  say:function(){console.log('sssssss')}

};

但是这样对内部成员name,say均起不到保护和隔离作用,因此这些内部的私有变量应该通过特权方法向外暴露,以控制访问安全性;

var singleton=function(){

  var name='';

  var say=function(){console.log('sssssss')};

  

  return {

    Name:name,

    Say:function(){return say;}

  }

};

这样就成为模块模式 一种标配,因为对象本身只会存在一份实例;但是这样有个缺点,就是创建出来的对象没有类型使用类型检测运算符:instanceof也检测不出来,为了解决这个问题,提出增强模块模式。

8 增强模块模式

var singleton=function(){

  var name='';

  var say=function(){console.log('sssssss')};

  

var obj=new SubType();//将这些私有成员暴露给指定类型上去,这样返回的单例对象就具有了某个类型的构造函数,也就可以使用instanceof检测。所以说是一种增强;

  obj.Name=name;

  obj.Say=function(){return say;}

  return obj;

};

重操JS旧业第九弹:函数表达式的更多相关文章

  1. 重操JS旧业第二弹:数据类型与类型转换

    一 数据类型 1 js中的数据类型 1.1 数据类型列举 1)number类型 2)boolean类型 3)string类型 4)对象类型 5)函数类型 6)undefined类型 1.2 数据类型获 ...

  2. 重操JS旧业第一弹:Script与JS加载

    不管js被包装成什么样子,最终交给浏览器执行的js都是原生的,都离不开原生js的原理. Script标签纸html中用来加载js的标签,我们知道js可以是来自外部,本地,或者内部一段代码,在这里只讨论 ...

  3. 重操JS旧业第五弹:函数

    函数在任何编程语言中起着非常重要的位置,因为他是功能的最小单元,在js中函数是一种类型 Function 1 申明与定义 显示声明:function cc(){};函数名其实是函数的一个指针,函数名某 ...

  4. 重操JS旧业第三弹:Array

    数组在任何编程语言中都是非常重要的,因为函数在最大程度上代表了要实现的功能,而数组则是这些函数所要操作的内存一部分. 1 构建数组 js与其他非脚本语言的灵活之处在于要实现一个目标它可能具有多种方式, ...

  5. 重操JS旧业第十弹:闭包

    闭包是js最难理解,也是最蛋疼的一个名词,仿佛只可意会不可言传一样,有人说闭包说白了就是函数嵌套,也有人说闭包就是函数能够访问函数外部的变量,而内部的外部访问不了: 貌似都非常有道理,其实仔细想来只不 ...

  6. 重操JS旧业第八弹:面向对象与继承

    js里面没有语言语法层面的继承机制,但这并不意味着js就不能实现继承,利用js属性和方法动态性来模拟实现继承,通过总结大概有如下方法实现: 1 原型链继承 我们知道原型在对象中扮演着重要的角色,函数本 ...

  7. 重操JS旧业第七弹:面向对象与对象创建

    JS是一种完全面向对象的程序设计语言,在面向对象处理方面,具有多种多样的实现方式,加之对象成员的动态性使得这门语言更加灵活:而js对象成员动态性也是创建和扩展对象的有力方式. 1 对象成员动态性 属性 ...

  8. 重操JS旧业第四弹:Date与Global对象

    1 Date原理 Date类型表示时间,js中采用UTC国际协调时间,以1971年1月1日0分0秒0微秒开始,经过的毫秒数来表示时间,比如一年的时间计算 1分:1000*60: 1小时:1000(毫秒 ...

  9. 重操JS旧业第十一弹:BOM对象

    BOM对象即浏览器内置对象,现今流行的浏览器内核有Safri,Firefox,Chrome,Opera,IE其中IE的兼容性是最蛋疼的在10及其过后还好点,但是现在IE基本上淘汰,而国内像360这种垃 ...

随机推荐

  1. Button的设置及各种属性

    (1)UIButton类继承自UIControl,而UIControl继承自UIView,因为UIView就是个矩形区域,所以UIButton实例化的对象其实都是一个矩形,虽然有各种圆角.增加联系人. ...

  2. 公共 DNS server IP 地址

    公共 DNS server IP 地址 名称 DNS server IP 地址 CNNIC SDNS 1.2.4.8 210.2.4.8 114 DNS 114.114.114.114 114.114 ...

  3. HDU 1862 EXCEL次序 (排序水问题)

    Problem Description Excel对能够记录一组由任意列排序指定.现在,请把你编译的代码类似特征.   Input 測试输入包括若干測试用例. 每一个測试用例的第1行包括两个整数 N ...

  4. 移动端rem,scale动态设置

    pt:物理像素(电容屏上像素块个数) px:逻辑像素.设备独立像素 高清屏:1px = 4pt 普通屏:1px = 1pt dpr:设备像素比:(某一方向上)物理像素/逻辑像素 通常设置1rem=屏幕 ...

  5. 轻量级数据库sqlite的编译

    sqlite是很多客户端程序所使用的一种轻量级数据库,但是目前没有lib文件,只有源码和dll文件,我们可以利用VS工具生成lib,然后在应用程序中使用. (1)下载地址 http://www.sql ...

  6. C# 继承细节

    假定没有为类定义任何显式的构造函数,这样编译器就会为所有的类提供默认的构造函数,在后台会进行许多操作,编译器可以很好地解决层次结构中的所有问题,每个类中的每个字段都会初始化为默认值.但在添加了一个我们 ...

  7. c语言中malloc realloc 和calloc的联系与区别

    (1)C语言跟内存分配方式 <1>从静态存储区域分配.       内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量.static变量.<2> ...

  8. MySQL中关于日期、时间的数据类型和函数

    一.日期相关的数据类型 1.datetime 占用8字节,既显示了日期,又显示了时间.其表示的日期范围为“1000-01-01 00:00:00”到“9999-12-31 23:59:59” 2.da ...

  9. BZOJ 2599 [IOI2011]Race【Tree,点分治】

    给出N(1 <= N <= 200000)个结点的树,求长度等于K(1 <= K <= 1000000)的路径的最小边数. 点分治,这道题目和POJ 2114很接近,2114是 ...

  10. 再造 “手机QQ” 侧滑菜单(一)——实现侧滑效果

    本系列文章中,我们将尝试再造手机QQ的侧滑菜单,力争最大限度接近手Q的实际效果,并使用 Auto Layout 仿造左侧菜单,实现和主视图的联动. 代码示例:https://github.com/jo ...