重操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这种垃 ...
随机推荐
- centOS下恢复win8引导
正题(非原创): shutdown两次以后确信我的win8引导没有了 百度后找到一个修改grub.cfg文件的方法 这个文件在普通用户下是没有修改的权利的 要在sudo su之后用root权限 vi ...
- D - 粉碎叛乱F - 其他起义
D - 粉碎叛乱 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Sta ...
- Js中的多条件排序,多列排序
參见github: https://github.com/Teun/thenBy.js
- stm32之中断系统
概述: 提供中断控制器,用于总体管理异常,称之为“嵌套向量中断控制器:Nested Vectored Interrupt Controller (NVIC) VIC:中断管理器: NVIC:内嵌中断管 ...
- aspx.cs上传文件
aspx.cs文件 using System; using System.Collections.Generic; using System.Linq; using System.Web; using ...
- Python 第十三篇之二:jQuery基础
一:jQuery是一个兼容多浏览器的javascript类库,核心理念是write less,do more(写得更少,做得更多),对javascript进行了封装,是的更加便捷的开发,并且在兼容性方 ...
- 【STL__set_的应用】
1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器, 更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结 ...
- ZOJ 3818 Pretty Poem 模拟题
这题在比赛的时候WA到写不出来,也有判断ABC子串不一样不过写的很差一直WA 在整理清思路后重写一遍3Y 解题思路如下: 第一种情况:ABABA. 先判断开头的A与结尾的A,得到A的长度, 接着判断A ...
- A*算法的C语言实现
#include ”stdio.h“ #include “conio.h” #include ”assert.h“ #include “stdlib.h” #define MAPMAXSIZE 100 ...
- Python基础1:一些小知识汇总
一.#!usr/bin/env python 脚本语言的第一行,指定执行脚本的解释器. #!/usr/bin/python 是告诉操作系统执行这个脚本的时候,调用/usr/bin下的python解释器 ...