《JavaScript-The Definitive Guide》读书笔记:函数定义和函数调用
定义函数
使用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》读书笔记:函数定义和函数调用的更多相关文章
- 《JavaScript高级程序设计》读书笔记 ---函数
函数函数对任何语言来说都是一个核心的概念.通过函数可以封装任意多条语句,而且可以在任何地方.任何时候调用执行.ECMAScript 中的函数使用function 关键字来声明,后跟一组参数以及函数体. ...
- 《javascript权威指南》读书笔记——第二篇
<javascript权威指南>读书笔记——第二篇 金刚 javascript js javascript权威指南 今天是今年的196天,分享今天的读书笔记. 第2章 词法结构 2.1 字 ...
- 《javascript权威指南》读书笔记——第一篇
<javascript权威指南>读书笔记——第一篇 金刚 javascript js javascript权威指南 由于最近想系统学习下javascript,所以开始在kindle上看这本 ...
- 《Javascript高级程序设计》读书笔记之对象创建
<javascript高级程序设计>读过有两遍了,有些重要内容总是会忘记,写一下读书笔记备忘 创建对象 工厂模式 工厂模式优点:有了封装的概念,解决了创建多个相似对象的问题 缺点:没有解决 ...
- 《JavaScript高级程序设计》读书笔记--前言
起因 web编程过程使用javascript时感觉很吃力,效率很低.根本原因在于对javascript整个知识体系不熟,看来需要找些书脑补一下,同时欢迎众网友监督. 大神推荐书籍 看了博客大神们推荐的 ...
- 《javascript权威指南》读书笔记(连载)
这是一篇很长的博客 终于把权威指南给买回来了,之前一直犹豫,第一:书太厚,怕买了不能坚持看完.第二:觉得太贵,最少100¥.现在实习也能发点工资了,给自己定了一个志愿:把一个月的工资用于买书.这么一想 ...
- <数据结构与算法分析>读书笔记--函数对象
关于函数对象,百度百科对它是这样定义的: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.又称仿函数. 听起来确实很难懂,通过搜索我找到一篇 ...
- 《JavaScript高级程序设计》读书笔记--(2)基本概念
变量 Javascript 是区分大小写的, 也就是说 var nun 与 var Num 是不同的变量. ECMAScript的变量是松散类型的,所谓松散类型就是可以保存任何类型的数据.ECMASc ...
- 《JavaScript权威指南》读书笔记(一)
日期 2015-11-28 把之前的读书笔记在我弄丢它之前搬过来~~ 时间过去好久,回头一看理解都不一样了. 重点浏览了一下和Java的不同之处: js是一种宽松类型语言:js不区别整形数值与浮点型数 ...
随机推荐
- centos6.5环境基于conga的web图形化界面方式配置rhcs集群
一.简介 RHCS 即 RedHat Cluster Suite ,中文意思即红帽集群套件.红帽集群套件(RedHat Cluter Suite, RHCS)是一套综合的软件组件,可以通过在部署时采用 ...
- Java发送邮件时标题和发件人乱码
最近碰到一个问题,Java发送邮件时,查看邮箱结果,发件人及邮件标题正文全部乱码 通过翻阅资料,原因及解决方法如下: // Set Subject: 头字段 message.setSubject(Mi ...
- 解决Jmeter插件ERROR: java.io.IOException: Agent is unreachable via TCP的错误
今天在centos上搭建jmeter监控服务,服务正常启动,我点击run,就在一切看起来很美好的时候,报错了,ERROR: java.io.IOException: Agent is unreacha ...
- https协议的接口测试
用jmeter测试https接口: 和传统的http协议套路不太一样. 注意细节: 1.取样器正常选择http请求,端口号:为443(具体根据接口文档我刚开始用的80端口所以错了) 2.请求方法,一定 ...
- css系列之box-sizing
转载自:http://zh.learnlayout.com/box-sizing.html 人们慢慢的意识到传统的盒子模型不直接,所以他们新增了一个叫做 box-sizing 的CSS属性.当你设置一 ...
- OCM_第六天课程:Section3 —》数据库可用性
注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...
- ORA-12638: 身份证明检索失败 的解决办法
今天在使用应用程序连接Oracle时碰到了 “ORA-12638: 身份证明检索失败” 错误, 解决方法:这是因为Oracle-client端的高级安全性验证导致,解决办法如下: 开始 -> 程 ...
- Highcharts实现图形报表(我主要实现javaweb开发的图形报表)
官网网址:https://www.hcharts.cn/ 中文版的(参考起来方便,你懂的.):http://www.mamicode.com/info-detail-446038.html 网上已经有 ...
- DbCommandInterceptor抓取EF执行时的SQL语句
EF6.1也出来不少日子了,6.1相比6.0有个很大的特点就是新增了System.Data.Entity.Infrastructure.Interception 命名空间,此命名空间下的对象可以允许我 ...
- asp.net core 微信扫码支付(扫码支付,H5支付,公众号支付,app支付)之1
2018-08-13更新生成二维码的方法 在做微信支付前,首先要了解你需要什么方式的微信支付,目前本人做过的支付包含扫码支付.H5支付.公众号支付.App支付等,本人使用的是asp.net mvc c ...