一、函数创建

1. 函数声明 (出现在全局作用域,或局部作用域)

function add (a, b)
{
return a + b;
}
function add(a, b)
{
return add1(a,b);
function add1(m, n)
{
return m + n;
}
}   

2. 函数表达式

  • 作为普通变量
var add = function (a, b){
return a + b;
};
  • 作为对象方法
var obj = {
value: 0,
add: function(a, b){
return a + b;
}
};
  • 作为函数返回值
function add(a)
{
var m = a;
return function(n){
return m+n;
};
}
  • 作为函数参数
var numbers = [1, 2, 3, 4, 5, 4, 3, 2];
var mapResult = numbers.map(function(item, index, array){
return item * 2;
});

3. 函数提升

function add (a, b)
{
var result1 = add1(a, b);
var result2 = add2(a, b); console.log(result1); // a+b
console.log(result2); // 输出TypeError add2 is not a function
function add1(m, n)
{
return m + n;
} var add2 = function(m, n){
return m + n;
}
}

add1 函数定义在函数add内部,在执行它时他会被提升到函数的顶部,提升到顶部后由于是在调用之前,因此add1的调用会正常执行。add2也会被提升到函数顶部,但由于仅仅提升了add2的定义,没有提升它的实现,因此add2的值在调用时为undefined。

二、函数调用

1.函数调用模式


var add = function (a, b){
return a + b;
};
var  result = add(1, 2);

2. 方法调用模式

var obj = {
sum: 10,
increament: function(n){
return this.sum + n;
}
};
obj.increament(1);

3. 构造器调用模式

  • 构造函数以new 进行调用实例化时,this绑定到新创建的对象上, 并返回此对象
function Person(name, age)
{
this.name = name;
this.age = age;
} var personObj = new Person('leon', 30);
  • 构造函数前面如果没有new运算符,则作为普通函数调用,此时this指向window对象,返回undefined
function Person(name, age)
{
this.name = name;
this.age = age;
} var personObj = Person('leon', 30);
console.log(window.name); // 'leon'
console.log(window.age); // 30

4. Apply调用模式(包括call方法)

  • 指定调用上下文环境
var add = function (a, b){
return a + b;
}; add.apply(null, [1, 2]); // 当指定null时,函数内部的this指向window对象(浏览器环境)
  • 方法借用
function getParams ()
{
return Array.prototype.filter.call(arguments, function(item,index){
return item > 2;
});
}
getParams(2, 3, 4);
  • 实现继承
// 父类
function Person(name, age)
{
this.name = name;
this.age = age;
}
// 子类
function Children(gender)
{
Person.apply(this, ['leon', 5]); // 继承父类的name 和 age 属性
this.gender = gender;
} var boy = new Children('male');
console.log(boy.name); // 'leon'
console.log(boy.age); // 5

三、高级应用

1. 函数绑定 (作用是保证函数在执行时,上下文环境保持不变)

// 自定义绑定函数
function bind(fn, context)
{
return function(){
return fn.apply(context, arguments);
};
}
var obj = {
value: 0,
add : function(a, b){
this.value = a + b;
}
};
var add = bind(obj.add, obj);

注意:es5中函数已有原生bind方法

var obj = {
value: 0,
add : function(a, b){
this.value = a + b;
}
}; var add = obj.add.bind(obj);

2. 函数curry化 (通过对函数预设一些参数从而生成一个新的函数的过程)

function curry(fn)
{
var args = Array.prototype.slice.call(arguments, 1);
return function(){
return fn.apply(null, args.concat(Array.prototype.slice.call(arguments)));
};
} function add (n1, n2)
{
return n1 + n2;
} var curryAdd = curry(add ,2);
var result = curryAdd(3); console.log(result);

javascript 高级编程系列 - 函数的更多相关文章

  1. javascript 高级编程系列 - 基本数据类型

    javascript中的基本数据类型包括: Undefined, Null, Boolean, Number, String 5种数据类型 1. Undefined 类型 (只有一个值 undefin ...

  2. javascript 高级编程系列 - 继承

    1. 原型链继承 (缺点:子类继承父类的引用类型的属性值会在各个实例中共享,创建子类实例时无法向父类构造函数传递参数) // 定义父类构造函数 function SuperClass(father, ...

  3. javascript 高级编程系列 - 创建对象

    1. 工厂模式 function createPerson(name, age) { var obj = {}; obj.name = name; obj.age = age; obj.getName ...

  4. javascript高级编程笔记01(基本概念)

    1.在html中使用JavaScript 1.  <script> 元素 <script>定义了下列6个属性: async:可选,异步下载外部脚本文件. charset:可选, ...

  5. JavaScript高级编程———JSON

    JavaScript高级编程———JSON < script > /*JSON的语法可以表达一下三种类型的值 简单值:使用与javas相同的语法,可以在JSON中表达字符串.数值.布尔值和 ...

  6. JavaScript高级编程——Array数组迭代(every()、filter()、foreach()、map()、some(),归并(reduce() 和reduceRight() ))

    JavaScript高级编程——Array数组迭代(every().filter().foreach().map().some(),归并(reduce() 和reduceRight() )) < ...

  7. JavaScript高级编程———数据存储(cookie、WebStorage)

    JavaScript高级编程———数据存储(cookie.WebStorage) <script> /*Cookie 读写删 CookieUtil.get()方法根据cookie的名称获取 ...

  8. JavaScript高级编程———基本包装类型String和单体内置对象Math

    JavaScript高级编程———基本包装类型和单体内置对象 <script> var stringObject = new String("hello world") ...

  9. JavaScript高级编程——Date类型

    JavaScript高级编程——Date类型 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" ...

随机推荐

  1. 【bzoj2724】[Violet 6]蒲公英 分块+STL-vector

    题目描述 输入 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1 输出 样例输入 6 3 1 2 3 2 1 2 1 5 3 ...

  2. Codeforces Round #345 (Div. 2)——A. Joysticks(模拟+特判)

    A. Joysticks time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  3. HDU——1003Max Sum(子序列最大和)

    Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  4. 按 Tab 在多个 InputField 间切换

    下面这个链接里的有些unity的东西还没搞懂..改天继续看 http://forum.unity3d.com/threads/tab-between-input-fields.263779/ if(I ...

  5. bzoj 3625小朋友和二叉树 多项式求逆+多项式开根 好题

    题目大意 给定n种权值 给定m \(F_i表示权值和为i的二叉树个数\) 求\(F_1,F_2...F_m\) 分析 安利博客 \(F_d=F_L*F_R*C_{mid},L+mid+R=d\) \( ...

  6. Java语言编码规范 - Java语言编码规范(中文版)(http://doc.javanb.com/code-conventions-for-the-java-programming-language-zh/index.html)

      目录 1 介绍 1.1 为什么要有编码规范 1.2 版权声明 2 文件名 2.1 文件后缀 2.2 常用文件名 3 文件组织 3.1 Java源文件 3.1.1 开头注释 3.1.2 包和引入语句 ...

  7. 洛谷P1372 a/b problem

    题目背景 “叮铃铃铃”,随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻.毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌.1000多个日夜的欢笑和泪水,全凝聚在毕业晚会上,相信,这一定 ...

  8. SQL2005:已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行.

    原文发布时间为:2008-08-04 -- 来源于本人的百度文章 [由搬家工具导入] 最近使用sql server2005,已经不止一次的发生了这样的错误.具体是怎么出来的我不清楚,其表现为:数据库中 ...

  9. 应用js函数柯里化currying 与ajax 局部刷新dom

    直接上代码吧 最近读javascript核心概念及实践的代码 感觉很有用 备忘. <div id="request"></div> <script t ...

  10. C++ 细节知识

    1.typedef struct child {string name;struct child* next;}; child* head; head = (child*)malloc(sizeof( ...