重操JS旧业第九弹:函数表达式
函数表达式,什么概念,表达式中的函数表达式。
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旧业第九弹:函数表达式的更多相关文章
- 重操JS旧业第二弹:数据类型与类型转换
一 数据类型 1 js中的数据类型 1.1 数据类型列举 1)number类型 2)boolean类型 3)string类型 4)对象类型 5)函数类型 6)undefined类型 1.2 数据类型获 ...
- 重操JS旧业第一弹:Script与JS加载
不管js被包装成什么样子,最终交给浏览器执行的js都是原生的,都离不开原生js的原理. Script标签纸html中用来加载js的标签,我们知道js可以是来自外部,本地,或者内部一段代码,在这里只讨论 ...
- 重操JS旧业第五弹:函数
函数在任何编程语言中起着非常重要的位置,因为他是功能的最小单元,在js中函数是一种类型 Function 1 申明与定义 显示声明:function cc(){};函数名其实是函数的一个指针,函数名某 ...
- 重操JS旧业第三弹:Array
数组在任何编程语言中都是非常重要的,因为函数在最大程度上代表了要实现的功能,而数组则是这些函数所要操作的内存一部分. 1 构建数组 js与其他非脚本语言的灵活之处在于要实现一个目标它可能具有多种方式, ...
- 重操JS旧业第十弹:闭包
闭包是js最难理解,也是最蛋疼的一个名词,仿佛只可意会不可言传一样,有人说闭包说白了就是函数嵌套,也有人说闭包就是函数能够访问函数外部的变量,而内部的外部访问不了: 貌似都非常有道理,其实仔细想来只不 ...
- 重操JS旧业第八弹:面向对象与继承
js里面没有语言语法层面的继承机制,但这并不意味着js就不能实现继承,利用js属性和方法动态性来模拟实现继承,通过总结大概有如下方法实现: 1 原型链继承 我们知道原型在对象中扮演着重要的角色,函数本 ...
- 重操JS旧业第七弹:面向对象与对象创建
JS是一种完全面向对象的程序设计语言,在面向对象处理方面,具有多种多样的实现方式,加之对象成员的动态性使得这门语言更加灵活:而js对象成员动态性也是创建和扩展对象的有力方式. 1 对象成员动态性 属性 ...
- 重操JS旧业第四弹:Date与Global对象
1 Date原理 Date类型表示时间,js中采用UTC国际协调时间,以1971年1月1日0分0秒0微秒开始,经过的毫秒数来表示时间,比如一年的时间计算 1分:1000*60: 1小时:1000(毫秒 ...
- 重操JS旧业第十一弹:BOM对象
BOM对象即浏览器内置对象,现今流行的浏览器内核有Safri,Firefox,Chrome,Opera,IE其中IE的兼容性是最蛋疼的在10及其过后还好点,但是现在IE基本上淘汰,而国内像360这种垃 ...
随机推荐
- HDU 4734 F(x) 2013 ACM/ICPC 成都网络赛
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4734 数位DP. 用dp[i][j][k] 表示第i位用j时f(x)=k的时候的个数,然后需要预处理下小 ...
- 解决warning: incompatible implicit declaration of built-in function 'malloc'
因为代码中使用了malloc函数和字符串函数.编译时出现错误 warning: incompatible implicit declaration of built-in function 'mall ...
- iOS 日历控件
近期需要写一个交互有点DT的日历控件,具体交互细节这里略过不表. 不过再怎么复杂的控件,也是由基础的零配件组装起来的,这里最基本的就是日历控件. 先上图: 从图中可以看出日历控件就是由一个个小方块组成 ...
- Intent过滤,intent-filter
Intent过滤 编写:kesenhoo - 原文:http://developer.android.com/training/basics/intents/filters.html 前两节课主要讲了 ...
- c语言中malloc realloc 和calloc的联系与区别
(1)C语言跟内存分配方式 <1>从静态存储区域分配. 内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量.static变量.<2> ...
- 深入理解-HashMap
一.HashMap概述 HashMap 在家族中位置:实现了Map接口,继承AbstractMap类.HashMap 允许key/value 都为null. 二.HashMap存储结构 HashMap ...
- mul16
设计思想:乘法运算本身就可以看做是一个移位相加的过程 1 1 0 1 0 = 26* 1 0 1 1 1 = 23 ...
- YARN & HDFS2 安装和配置Kerberos
今天尝试在Hadoop 2.x开发集群上配置Kerberos,遇到一些问题,记录一下 设置hadoop security core-site.xml <property> <name ...
- JavaScript自调用匿名函数
Self-Invoking Anonymous Function,即自调用匿名函数.顾名思义,该函数没有名称,不同的是,该函数定义后立即被调用.该函数的作用是在应用中初始化或做一次性工作. 普通匿名函 ...
- Hdu 1158 Employment Planning(DP)
Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=1158 一道dp题,或许是我对dp的理解的还不够,看了题解才做出来,要加油了. 只能先上代码了 ...