重操JS旧业第九弹:函数表达式

时间:2023-02-26 08:52:05

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

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. 论文笔记之:Decoupled Deep Neural Network for Semi-supervised Semantic Segmentation

    Decoupled Deep Neural Network for Semi-supervised Semantic Segmentation xx

  2. Javascipt数组去重的几种方式

    方法一 function unique(arr) { var retArr = []; for (var i = 0; i < arr.length; i++) { (retArr.indexO ...

  3. java四种访问控制权限:public &comma;default&comma;protected&comma;private

    四种访问权限的控制 范围 private default protected  public 同一个类中 √ √ √ √ 相同包不同类 × √ √ √ 不同包的子类中 × × √ √ 不同包非子类 × ...

  4. Python之 string 和 random方法

    1. import string import string print(string.ascii_lowercase) #输出全部小写字母a-z print(string.ascii_letters ...

  5. 移动硬盘和u盘的区别

    移动硬盘和U盘都属于便携性存储器,用于计算机之间的数据交换.但移动硬盘和U盘的区别还是非常大的,包括内部构造.容量以及整体外观上. 移动硬盘又分为机械移动硬盘和固态移动硬盘两种,主要区别在于内置的存储 ...

  6. HTML页面局部刷新

    /.事件响应刷新:有请求才会刷新 1.通过JS HTML DOM或jQuery获取HTML元素,通过DOM方法或jQuery方法监听页面事件,获取用户请求: 2.通过Ajax将用户请求提交至服务器,服 ...

  7. 【翻译】What is State Machine Diagram&lpar;什么是状态机图&rpar;&quest;

    [翻译]What is State Machine Diagram(什么是状态机图)? 写在前面 在上一篇学习类图的时候将这个网站上的类图的一篇文章翻译了出来,感觉受益良多,今天来学习UML状态机图, ...

  8. 第三百七十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch&lpar;搜索引擎&rpar;用Django实现我的搜索以及热门搜索

    第三百七十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现我的搜索以及热门 我的搜素简单实现原理我们可以用js来实现,首先用js获取到 ...

  9. Flask中那些特殊的装饰器

    模板相关的装饰器 @app.template_global() 用法: @app.template_global() # 记得加括号 def jiafa(a, b): # 这个方法每调用一次就需要传一 ...

  10. Delphi DBGrid双击事件、单元格操作

    1.得到当前格子中的内容:DBGrid1.Fields[DBGrid1.SelectedIndex].DisplayText;把DBGrid1.SelectedIndex改为你所希望引用的字段就可以了 ...