函数的两种创建方式:函数定义表达式、函数声明语句
编译时,函数声明语句创建的函数会‘被提前’至外部函数的作用域顶部,在该作用域内可以被随意调用;
而函数表达式创建的函数,要调用它必须赋值给一个变量,编译时将把它当做变量处理,会‘声明提前’,无法调用函数体本身;
函数定义表达式创建的函数也可包含名称,主要用于递归调用;
如果一个函数没有返回值,则返回值为undefined;
 
函数调用:作为函数调用、作为对象的方法调用、作为构造函数、作为别的对象的方法间接调用(call()、apply()、bind())
作为对象的方法调用时,函数的当前上下文是对象,即this的指向,可以通过返回对象本身(this)来实现“链式调用”
这种方式创建函数要少用:var f = new Function('x','y','return x+y'),Function的构造函数创建的函数是动态运行和编译的,影响性能,它无法捕捉局部作用域;
当有可选参数时,需把它放到参数列表最后,若传入的实参个数少于形参个数,则剩下的形参将赋值为undefined,所以最好在函数体内为省略的形参设定初始值,如a = a || 0;
嵌套函数的this指向的是全局对象、undefined或调用它时的当前上下文,而非外层函数;
 
定义函数时,若参数个数多且必须有序,则应把它先放入对象内,再把该对象作为参数传入,然后再处理函数的元素,这样就省了记参数顺序的麻烦;
 
面向对象的模块化编程:见实例;
为了防止全局变量与其它域的全局变量起冲突,需要将整个代码放入一个函数(或匿名函数)内,并立即执行,将其转化为局部变量,如:
匿名函数模块:( function(){....}() ); 外部括号的作用是让编译器理解为是一个函数表达式;
函数式模块:function myModule(){....}    myModule(); 先定义、后执行;
全局变量模块:var module = ( function(){...} ) (); 该变量保存了一个立即执行的函数表达式创建的函数的返回值;
 
闭包:
(由于在函数外部不能直接的访问、修改函数的局部变量,所以需要使用闭包)
        在函数的外部,通过内部函数访问、修改外部函数的局部变量,这个内部函数就称为闭包,而这些局部变量就被内部函数一直引用着,即使外部函数退出后,它们也保持在内存中;
        在函数调用时都会自动包含一个this和一个arguments
this指向的是当前上下文对象,闭包执行时的上下文对象通常不是外部函数,所以若要在闭包内使用this,需要在外部函数中将this保存在一个变量中var self = this,然后再使用变量self来绑定到外部函数;
arguments绑定的是当前上下文函数的参数,他是类数组对象,若要让闭包使用外部函数的arguments,需先将外部的arguments绑定到一个变量,再通过该变量来访问,var outerArguments = arguments;
 
循环中的闭包
一个常见的错误出现在循环中使用闭包,假设我们需要在每次循环中调用循环序号
for(var i =0; i <10; i++){
    setTimeout(function(){
        console.log(i);  
    },1000);
}
上面的代码不会输出数字 0 到 9,而是会输出数字 10 十次。
当 console.log 被调用的时候,匿名函数保持对外部变量 i 的引用,此时 for循环已经结束, i 的值被修改成了 10.
为了得到想要的结果,需要在每次循环中创建变量 i 的拷贝。
避免引用错误
为了正确的获得循环序号,最好使用 匿名包裹器(译者注:其实就是我们通常说的自执行匿名函数)。
for(var i =0; i <10; i++){
    (function(e){
        setTimeout(function(){
            console.log(e);  
        },1000);
    })(i);
}
外部的匿名函数会立即执行,并把 i 作为它的参数,此时函数内 e 变量就拥有了 i 的一个拷贝。
 
当传递给 setTimeout 的匿名函数执行时,它就拥有了对 e 的引用,而这个值是不会被循环改变的。
 
有另一个方法完成同样的工作;那就是从匿名包装器中返回一个函数。这和上面的代码效果一样。
 
for(var i =0; i <10; i++){
    setTimeout((function(e){
        returnfunction(){
            console.log(e);
        }
    })(i),1000)
}
 
函数式编程:见实例

JavaScript学习笔记-函数的更多相关文章

  1. JavaScript学习笔记——函数

    javascript函数的声明和调用 将完成某一特定功能的代码集合起来,可以重复使用的代码块. 一.函数的声明方式(创建) A.基本语法 function 关键字 function 函数名([参数1] ...

  2. JavaScript学习笔记-函数实例

    函数实例 var p = { a:15, b:'5', f1:function(){ var self = this; console.log(self.a+self.b); f2(); functi ...

  3. JavaScript:学习笔记(5)——箭头函数=>以及实践

    JavaScript:学习笔记(5)——箭头函数=>以及实践 ES6标准新增了一种新的函数:Arrow Function(箭头函数).本文参考的链接如下: MDN箭头函数:https://dev ...

  4. Java程序猿的JavaScript学习笔记(8——jQuery选择器)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  5. Java程序猿JavaScript学习笔记(2——复制和继承财产)

    计划和完成在这个例子中,音符的以下序列: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaSc ...

  6. Java程序猿的JavaScript学习笔记(3——this/call/apply)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  7. Java程序猿JavaScript学习笔记(4——关闭/getter/setter)

    计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...

  8. Java程序猿JavaScript学习笔记(14——扩大jQuery UI)

    计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...

  9. javascript学习笔记(四) Number 数字类型

    数字格式化方法toFixed().toExponential().toPrecision(),三个方法都四舍五入 toFixed() 方法指定小数位个数  toExponential() 方法 用科学 ...

随机推荐

  1. Java多线程系列--“JUC线程池”05之 线程池原理(四)

    概要 本章介绍线程池的拒绝策略.内容包括:拒绝策略介绍拒绝策略对比和示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3512947.html 拒绝策略 ...

  2. VS2013正则表达式应用示例

    VS2013正则表达式语法 在查找替换对话框中查看 VS2013语法可在查找替换对话框中查看,具体过程如下: 通过编辑->查找和替换->在文件中替换或者相应快捷键(Ctrl+Shift+H ...

  3. [转载]基于TFS实践敏捷-Scrum模式运用

    根据Forrester Research今年第二季度的一份研究报告,在超过1000名专业开发人员中,采用敏捷模式进行软件开发的已经有10.9%采用了Scrum模式,在所有的敏捷开发模式中名列首位,而在 ...

  4. NET中验证控件表达式汇总

    ASP.NET为开发人员提供了一整套完整的服务器控件来验证用户输入的信息是否有效.这些控件如下: 1.RequiredFieldValidator:验证一个必填字段,如果这个字段没填,那么,将不能提交 ...

  5. 一:验证微信的Token

    前言:申请到微信公众号的同学,可能会挺感兴趣的,毕竟微信公众号,确实是一个好东西,它提供了一个很好的平台,而且它自带有一套管理模板,对于微信公众号可以很好的管理. 但是也仅仅是很好的管理,因为作为开发 ...

  6. CNN笔记

    Deep Learning是全部深度学习算法的总称,CNN是深度学习算法在图像处理领域的一个应用. 转 http://blog.csdn.net/stdcoutzyx/article/details/ ...

  7. Python处理JSON

    从开源中国的博客搬来,合并博客 一.JSON是什么? JSON是一种轻量级的数据交换格式 二.Python处理JSON的思维 其实很容易理解,无非是将数据编成JSON格式数据和吧JSON格式的数据解析 ...

  8. DB表的关系及EF中Fluent API的使用

    现在使用多数的数据库是关系型数据库,那么表与表之间的关系就会显得尤其重要,对于数据的CRUD处理和以后数据的分析有很大的好处.下面是对于数据库中对表关系的理解以及在EF中使用Fluent API来创建 ...

  9. jquery的promise实践--连续加载图片

    在javascript设计模式实践之代理模式--图片预加载中用代理模式实现了图片预加载功能. 现在就更进一步,完成一个能够一张一张的连续图片加载的功能. 功能: 1.一张一张加载图片. 2.加载错误, ...

  10. C#常用类库

    1.0 TimeSpan  TimeSpan passTime = (TimeSpan)(DateTime.Now - curUser.refuseTime); if (passTime.Days * ...