JavaScript高级程序设计学习笔记(7)

JavaScript高级程序设计学习笔记

1.对JavaScript实现各个组成部分的详尽解读
2.对JavaScript面向对象编程的全方位阐述
3.DOM,BOM及浏览器事件模型的透彻剖析
4.Web应用基本数据格式JSON,XML及存取
5.Ajax,Comet服务器端通信和基于File API的拖放式文件上传
6.ECMAScript 5定义的最核心语言特性
7.HTML 5涵盖的表单,媒体,Canvas(包括WebGL)
8.Selectors、Web Workers、地理定位及跨文档传递消息等最新API
9.离线应用及客户端存储(包括IndexedDB)
10.维护、性能、部署相关的最佳开发实践
11.新兴API及ECMAScript Harmony展望

**对JavaScript面向对象编程的全方位阐述 **

函数表达式

     定义函数有两种:
1)函数声明。关于函数声明,一个重要的特征就是函数声明提升 ,意思就是在执行代码之前会先读取函数声明。这就意味着,函数声明和调用语句的顺序可以不确定

function functionName(arg0,arg1,arg2){
      //函数体
}

2)函数表达式。这种方式创建的函数叫匿名函数(拉姆达函数)。匿名函数的name属性是空字符串。使用 函数表达式定义函数,函数定义必须在调用前面否则会抛出错误。

var functionName=function(arg0,arg1,arg2){
      //函数体
}

     注意下面这种情况:在使用if语句进行条件判断时,只能使用函数定义
JavaScript高级程序设计学习笔记(7)_第1张图片
1.递归

  • 递归就是函数通过名字调用自身情况下构成
  • 在这里插入图片描述
  • 使用arguments.callee是一个正在执行的函数指针。将递归的函数名换为arguments.callee()

2.闭包(★★★)

  • 闭包是指有权访问另一个函数作用域中的变量的函数
function makeCompare(propertyName) {
       return function (object1,object2) {
           var value1=object1[propertyName];
           var value2=object2[propertyName];
           if (value1value2){
               return 1;
           } else {
               return 0;
           }
       };
   }
  • 创建闭包:在一个函数内部创建另一个函数
  • 在闭包中作用域包含两个变量对象:本地活动对象和全局变量对象,一般来说,当函数执行完毕后,局部活动会被销毁,内存中保存全局作用域
  • 闭包会携带包含它的函数的作用域,因此会被其它函数占用更多的内存
  • 注意闭包只取得函数中任何变量最后一个值。闭包保存的是整个变量对象,并非某个特殊变量
    JavaScript高级程序设计学习笔记(7)_第2张图片
    关于this对象
         由于this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而函数被当作某个对象的方法调用时,this等于那个对象
    JavaScript高级程序设计学习笔记(7)_第3张图片
  • 代码返回的是“The Window”,中间和右面是“My Object”
  • 左边输出为“The Window”的原因:调用函数时调用的是object.getNameFunc()(),我们将调用函数的代码换成:
var head=object.getNameFunc();
var foot=head();

     这样就意味着第一个head返回的是匿名函数,其中this指的是object对象;但是foot的值是head函数,在函数调用的时候,其活动对象会自动取两个特殊变量:this和arguments。内部函数会搜索两个变量直到搜索到活动对象为止,因此永远不能直接访问外部函数的两个变量。也就是说head()只能向上访问,他的上一级是全局变量var name=“The Window”

JavaScript高级程序设计学习笔记(7)_第4张图片

  • 返回的是“My Object”
  • 对于中间的代码来说,此时在对象的方法getNameFunc中,将this赋值给that,此时this指向object对象,后面调用函数object.getNameFunc()()返回时自然返回的是“My Object”

JavaScript高级程序设计学习笔记(7)_第5张图片

  • 返回的是“My Object”
  • 对于中间的代码来说,后面调用函数object.getNameFunc(),此时this指向对象object,返回时自然返回的是“My Object”

3.模仿块级作用域(★★)

  • JavaScript没有块级作用域的概念
  • 创建一个变量后,如果重新声明,变量还是原来的值。意思就是变量一旦在语句中定义,JavaScript会对后续的声明视而不见。
  • 块级作用域:下面的代码时立即调用一个匿名函数。将函数声明包含在一对圆括号,表示实际上是一个函数表达式。紧随后面的圆括号会立即调用这个函数
    在这里插入图片描述
    注意:在匿名函数中定义的任何变量,都会在执行结束时被销毁这样就可以防止全局变量和函数出现命名冲突。

4.私有变量(★)
     JavaScript中没有私有成员的概念;所有对象的属性都是共有的。

  • 在函数中定义的变量,可以认为是私有变量,因为在在函数外部不能访问这些变量。私有变量包括函数的参数,局部变量和在函数内部定义的其他函数
  • 特权方法:指有权访问私有变量和私有函数的公有方法
    JavaScript高级程序设计学习笔记(7)_第6张图片
    静态私有变量
         通过私有作用域中定义私有变量或函数,同样也可以创建特权方法,基本模式如下:
    JavaScript高级程序设计学习笔记(7)_第7张图片
         这个模式创建一个私有作用域,首先定义了私有变量和私有函数,然后定义构造函数及其公有函数。
    注意:初始化未经声明的变量,总会创建一个全局变量,注意“var”的使用
         这个模式与在构造函数中定义特权方法的主要区别,在于私有变量和函数是由实例共享的。
    模块模式
         前面的模式识用于为自定义类型创建私有变量和特权方法的。而模块模式则是为单例创建私有变量和特权方法。单例指的就是只有一个实例对象。
    JavaScript高级程序设计学习笔记(7)_第8张图片

你可能感兴趣的:(看书笔记,JavaScript)