定义函数

使用function关键字来定义函数,分为两种形式:

  • 声明式函数定义;

     function add(m,n) {
    alert(m+n);
    }

    这种方式等同于构造一个Function类的实例的方式:

    var add = new Function("m", "n", "alert(m+n);");

    Function类构造方法的最后一个参数为函数体:"alert(m+n);",前面的都是函数的形参,参数必须是字符串形式的:"m","n"。

  • 函数表达式;
     //将一个匿名函数赋值给变量add
    var add = function(m, n) {
    alert(m + n);
    };
    add(1, 2);// //函数表达式作为参数传递给其他函数
    var arr = [1, 3, 4, 2];
    arr = arr.sort(function(a, b) {
    return a - b;
    });
    alert(arr);//1,2,3,4 //定义后立即调用
    alert( function(m, n) {
    return m + n;
    }(1, 2)); //函数表达式也可以定义名称(如用于递归)
    var f=function fact(x){
    if(x<1) {
    return 1;
    }else{
    return x*fact(x-1);
    }
    };

声明式函数定义和函数表达式的一点区别

声明式函数定义语句属于顶级作用域范围,函数调用语句可写在函数声明语句之前:

add(1, 2);//
function add(m, n) {
alert(m + n);
}

函数表达式定义的函数在定义之前无法调用:

//TypeError: add is not a function
add(1, 2);
var add = function(m, n) {
alert(m + n);
};

函数的返回值

Javascript中的函数不需要声明返回类型,使用return关键字返回一个值。若函数不包含return语句,或者直接使用"return;",则函数的返回值为undefined。

嵌套函数

函数可以嵌套在其他的函数里面,内层函数可以访问外层函数的参数和变量:

function add(m, n) {

    function d(x) {
return x * 2;
} return d(m) + d(n);
} alert(add(1, 2));//

调用函数

函数体代码在函数被调用时才会执行。Javascript函数有4中调用方式:

  • 普通的函数调用
  • 方法调用
  • 构造函数调用
  • 通过 call() 和 apply() 间接调用

普通的函数调用

最常用的函数调用方式,如:

alert("hello");

var result = add(1, 2);

方法调用

所谓方法就是将一个函数赋给一个对象的属性:

 //定义一个函数
function hello(name) {
alert('hello,' + name);
};
var user = {}; //赋值给user的sayHi属性
user.sayHi = hello; //方法调用
user.sayHi('张三');

普通的函数调用和方法调用的一个区别:在"普通的函数调用"方式中,函数的调用上下文(this的值),为全局对象(非严格模式)或者undefined(严格模式)。而在"方法调用"方式中,this指向当前对象。利用这一特性,我们可以在方法不需要明确的返回值时,直接返回this,从而实现"方法链"。如jquery中常见的:

$('#btn_edit').css({color:red}).show();

嵌套函数中的this:嵌套函数中,内层函数不会继承外层函数的this,即当内层函数作为方法调用时,内层函数的this指向当前调用对象;当内层函数作为函数调用时,this的值为全局对象(非严格模式)或者undefined(严格模式)。怎样在内层函数中访问外层函数的this呢?通常将this保存在一个局部变量中,通过变量来访问:

 var obj = {
f : function() {
var self = this;
console.log(this === obj);//true,this指向当前对象 f1(); function f1() {
console.log(this === obj);//false,this为全局对象或者undefined
console.log(self === obj);//true,self指向外层this,即当前对象
}
}
};

构造函数调用

当使用new关键字创建一个对象时,即调用了构造函数。构造函数若没有形参,可以省略圆括号:

var obj = new Object();
//等价于
var obj = new Object;

调用构造函数,创建了一个新对象,这个新对象会成为该构造函数的调用上下文(this的值):

function User(name) {
this.name=name;
console.debug(this);
} var user = new User('张三');

call() 和 apply() 间接调用

Javascript中函数也是对象,也拥有方法。其中 call() 和 apply() 可以用来间接调用函数。call() 的第一个参数用来指定调用上下文(即this的值),后面的参数是传入调用函数的实参。

 var name = 'A';
var user = {
name : 'B'
}; function showName() {
alert(this.name);
} showName();//A,this为全局对象
showName.call(user);//B,this为user对象

apply() 和 call() 类似,区别在于,后面的实参需要以数组的形式传递(可将当前函数的arguments数组直接传入)。

《JavaScript-The Definitive Guide》读书笔记:函数定义和函数调用的更多相关文章

  1. 《JavaScript高级程序设计》读书笔记 ---函数

    函数函数对任何语言来说都是一个核心的概念.通过函数可以封装任意多条语句,而且可以在任何地方.任何时候调用执行.ECMAScript 中的函数使用function 关键字来声明,后跟一组参数以及函数体. ...

  2. 《javascript权威指南》读书笔记——第二篇

    <javascript权威指南>读书笔记——第二篇 金刚 javascript js javascript权威指南 今天是今年的196天,分享今天的读书笔记. 第2章 词法结构 2.1 字 ...

  3. 《javascript权威指南》读书笔记——第一篇

    <javascript权威指南>读书笔记——第一篇 金刚 javascript js javascript权威指南 由于最近想系统学习下javascript,所以开始在kindle上看这本 ...

  4. 《Javascript高级程序设计》读书笔记之对象创建

    <javascript高级程序设计>读过有两遍了,有些重要内容总是会忘记,写一下读书笔记备忘 创建对象 工厂模式 工厂模式优点:有了封装的概念,解决了创建多个相似对象的问题 缺点:没有解决 ...

  5. 《JavaScript高级程序设计》读书笔记--前言

    起因 web编程过程使用javascript时感觉很吃力,效率很低.根本原因在于对javascript整个知识体系不熟,看来需要找些书脑补一下,同时欢迎众网友监督. 大神推荐书籍 看了博客大神们推荐的 ...

  6. 《javascript权威指南》读书笔记(连载)

    这是一篇很长的博客 终于把权威指南给买回来了,之前一直犹豫,第一:书太厚,怕买了不能坚持看完.第二:觉得太贵,最少100¥.现在实习也能发点工资了,给自己定了一个志愿:把一个月的工资用于买书.这么一想 ...

  7. <数据结构与算法分析>读书笔记--函数对象

    关于函数对象,百度百科对它是这样定义的: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.又称仿函数. 听起来确实很难懂,通过搜索我找到一篇 ...

  8. 《JavaScript高级程序设计》读书笔记--(2)基本概念

    变量 Javascript 是区分大小写的, 也就是说 var nun 与 var Num 是不同的变量. ECMAScript的变量是松散类型的,所谓松散类型就是可以保存任何类型的数据.ECMASc ...

  9. 《JavaScript权威指南》读书笔记(一)

    日期 2015-11-28 把之前的读书笔记在我弄丢它之前搬过来~~ 时间过去好久,回头一看理解都不一样了. 重点浏览了一下和Java的不同之处: js是一种宽松类型语言:js不区别整形数值与浮点型数 ...

随机推荐

  1. FreeSWITCH IVR中lua调用并执行nodejs代码

    一.功能需求: 通过FreeSWITCH的IVR按键调用相应的脚本文件:nodejs提供很多的模组,可以方便的与其它系统或者进行任何形式的通讯,我的应用是通过nodejs发送http post请求: ...

  2. windows 7安装apache

    最近想在PHPEclipse 上开发PHP项目,但遇到的一个问题是:无法在Web 上浏览PHP页面,更谈不上调试了.这一点让人很是纠结,在浏览网上大量的相关内容后,该问题已经解决. 具体的操作过程详见 ...

  3. 【python】xsspider零碎知识点

    1.提取url信息 urlparse() from urlparse import urlparse url = "http://scrapy-chs.readthedocs.io/zh_C ...

  4. (四)CXF处理JavaBean以及复合类型

    前面讲的是处理简单类型,今天这里来讲下CXF处理JavaBean以及复合类型,比如集合: 这里实例是客户端传一个JavaBean,服务器端返回集合类型: 在原来的项目实例基础上,我们先创建一个实体类U ...

  5. Java 变量、循环、判断

    粗糙笔记不喜勿喷 Java 8大基本类型 第一类:逻辑型(boolean) 1.boolean类型只存在true(真),false(假)两种形式 例: boolean a=true; boolean ...

  6. 网页异步加载之AJAX理解

    AJAX AJAX介绍 AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 是一种用于创建快速动态网页的技术 AJAX ...

  7. 一份针对nginx的内核优化参数

    首先,需要修改/etc/sysctl.conf来更改内核参数.例如,最常用的配置: # ·file-max:这个参数表示进程(比如一个worker进程)可以同时打开的最大句柄数,这个参数直接限制最大并 ...

  8. Python 打印当前文件相对路径和绝对路径

    一.打印相对路径 print(__file__) 二.打印绝对路径 import os print(os.path.abspath(__file__)) 三.打印文件名 import os print ...

  9. 非常可乐 HDU1495

    BFS题 一共有六种状态转移 一一枚举就好 设置一个标记数组. 用二重循环可以很清晰的解决代码长的问题 #include<cstdio> #include<cstring> # ...

  10. 017 Spark的运行模式(yarn模式)

    1.关于mapreduce on yarn 来提交job的流程 yarn=resourcemanager(RM)+nodemanager(NM) client向RM提交任务 RM向NM分配applic ...