《javascript高级程序设计》笔记:Function类型
这么长时间没有写博客,就是因为函数这部分比较麻烦,自己一直想抽出大把的时间来研究这个,可是结果却是一拖再拖,这样不好。有时间就写才是王道啊,不然这计划得一直卡在这里了..
1. 几个概念
函数:将代码进行封装, 复用的逻辑单元(代码)
对象:无序键值对的集合
数组:有序键值对的集合, 数组的索引号就是键
属性:对象属性的值是一个普通的数据
方法:对象的属性是一个函数
对象的成员:包括属性和方法
另外关于函数,你应该时刻记住的是:函数也是对象,函数名是一个指向函数对象的指针。因此,函数也可以作为参数传递
2. 函数的三种创建方式
2.1 函数表达式
标准语法:
var fn = function(){}; // 只能在声明之后调用
有一种写法也需要注意,可能在面试题中会遇到:
var fn = function fn1(){}; // 不会报错
有这样一个例子,能够很好的区分两种写法的差异
// 标准写法
var fn = function(){console.log(fn); // function (){ console.log(fn) }
};
fn();
console.log(fn); // function (){ console.log(fn) }// 非主流写法
var fn1 = function fn2() {console.log(fn1);console.log(fn2);
}
fn1();
console.log(fn1);
console.log(fn2);
为了更有说服力,我直接上图吧!
结论:
函数表达式声明方式中,function后面也可以添加函数名,但仅能在函数内部使用
2.2 函数声明
语法:
function fn(){}; // 能够在作用域下的任何地方使用
2.3 构造函数声明
语法:
var fn = new Function(param1, param2, body)
Function构造函数可以接受任意数量的参数,但最后一个参数始终被看做函数体,相当于一个小型的js编译器(执行效率低)
var fn = new Function(num1, num2, “return num1+num2”);
// 等价于
function fn(num1, num2) {return num1 + num2;
}
// 或
var fn = function(num1, num2) {return num1 + num2;
}
2.3 函数声明和函数表达式的区别
1 函数声明会把整个函数体提升到最前面function fn() {}
,因此调用的位置没有先后之分;函数表达式只会把函数名字提升var fn = function() {};
此时函数作为数据,因此必须先声明后使用
2 函数声明不能够出现在其他语句块中!函数声明能够出现的位置: 全局环境中其他函数内部
个人建议:从代码可维护性出发,尽量使用函数表达式的方式来声明函数
3. 函数内部属性
1.name属性
函数名.name => 获取字符串类型的函数名称
// 外部
function fn1(){};
console.log(fn1.name); // fn1
// 内部
function fn2() {console.log(fn2.name); // fn2
}
fn2();
2.length属性
函数名.length => 获取形参的个数,未传参时返回0
// 外部
function fn1(a,b){};
console.log(fn1.length); // 2
// 内部
function fn2(a,b,c) {console.log(fn2.length); // 3
}
fn2();
3.caller属性
函数名.caller => 获得调用函数的函数引用(函数在哪被调用),如果在全局中调用当前函数,值为null
var inner = function() {alert(inner.caller);
};
var outer = function() {inner();
};
outer(); // function() { inner(); };
inner(); // null
4.arguments属性
arguments只能在函数内部使用,用来获取传入的实参。是一个伪数组
其内部有如下属性:
arguments.length:获取实参的个数
arguments.callee:获取当前函数的引用,一般用在匿名函数递归中
// 阶乘
function factorial(num) {if(num <= 1) {return 1;} else {return num * arguments.callee(num - 1);}
}
5.this属性
this会在下一篇博客中详细讲解,先记住一句话:
this的指向和函数执行的环境相关,与它声明的环境无关
4.函数的形参和实参
形参:函数声明时的参数,起占位作用——函数名.length(形参个数)
实参:函数调用时的参数,实际参与运算的值—arguments.length(实参个数)
当形参个数大于实参时,多余的形参将设置成undefined
当实参个数大于形参时,无法直接获得所有的实参,通过arguments获得实参
参数传递的理解:形参相当于一个具有局部作用域不需要声明的和实参指向相同堆地址对象的值,其类型与实参相同
《javascript高级程序设计》笔记:Function类型相关推荐
- JavaScript高级程序设计笔记01 | 第一章到第四章 | 关键字与保留字 | 数据类型 | 操作符 | 作用域
观前提示:大部分都是书上的内容,个人理解的部分的较少,看我的笔记还不如去看书 第二章 async:可选.表示应该立即下载脚本,但不应妨碍页面中的其他操作,比如下载其他资源或 等待加载其他脚本.只对外部 ...
- javascript高级程序设计--笔记01
概述 JavaScript的实现包含三个部分: 1 核心(ECMAScript) 提供核心语言功能 2 文档对象模型(DOM) 一套提供了访问以及操作网页内容的API 3 浏览器对象模型( ...
- JavaScript高级程序设计笔记 - 第四章 变量 作用域 内存问题
4.1 基本类型和引用类型的值 基本类型: 简单的数据段 引用类型: 指那些可能有多个值构成的对象, 指保存在内存中的对象 4.1.2 复制变量值 除了保存的方式不同之外,在从一个变量向另一个变量复制 ...
- JavaScript高级程序设计笔记 事件冒泡和事件捕获
1.事件冒泡 要理解事件冒泡,就得先知道事件流.事件流描述的是从页面接收事件的顺序,比如如下的代码: <body><div> click me!</div> < ...
- 读javascript高级程序设计07-引用类型、Object、Array
一.引用类型 ECMAScript是支持面向对象的,可以通过引用类型描述一类对象所具有的属性和方法. 创建对象实例的方法时是用new 操作符加构造函数:var p=new Person(). 二.Ob ...
- javascript高级程序设计笔记
1.要讲一个值转换成其对应的Boolean类型 ,可以调用转型函数Boolean(). var message="hello world!"; var messageAsBoole ...
- 读javascript高级程序设计-目录
javascript高级编程读书笔记系列,也是本砖头书.感觉js是一种很好上手的语言,不过本书细细读来发现了很多之前不了解的细节,受益良多.<br/> 本笔记是为了方便日后查阅,仅作学习交 ...
- 《javascript高级程序设计》笔记:内存与执行环境
上一篇:<javascript高级程序设计>笔记:继承 近几篇博客都会围绕着图中的知识点展开 由于javascript是一门具有自动垃圾收集机制的编程语言,开发者不必担心内存的分配和回收的 ...
- 《Javascript高级程序设计》读书笔记之对象创建
<javascript高级程序设计>读过有两遍了,有些重要内容总是会忘记,写一下读书笔记备忘 创建对象 工厂模式 工厂模式优点:有了封装的概念,解决了创建多个相似对象的问题 缺点:没有解决 ...
- 读书笔记(06) - 语法基础 - JavaScript高级程序设计
写在开头 本篇是小红书笔记的第六篇,也许你会奇怪第六篇笔记才写语法基础,笔者是不是穿越了. 答案当然是没有,笔者在此分享自己的阅读心得,不少人翻书都是从头开始,结果永远就只在前几章. 对此,笔者换了随 ...
最新文章
- 2021年大数据Flink(三十五):​​​​​​​Table与SQL ​​​​​​案例二
- 命令行使用.so文件内的函数_如何使用SFC命令行工具修复Windows 10系统文件
- Centos7环境安装Kibana5.2.2
- C语言对内存地址的封装
- rabbitmq 拉取消息太慢_面试官:消息队列这些我都要问
- 嵌入式Linux系统编程学习之八基于文件指针的文件操作
- 创建苹果id失败_自制无添加苹果干 无糖
- Matlab使用过程中内存不足问题的总结(修改)
- 机器学习精讲(向量逼近+函数逼近)学习笔记——第五章
- 【2019】微软Power BI 每月功能更新系列——Power BI 8月版本功能完整解读
- pands 画图 调整大小_两个精品案例解释机械设计的步骤,有思路,再着手画图...
- 利用计算机计算问题的案例,两个基于计算思维培养的高中信息技术教学案例
- MAC PS更换登记照背景颜色
- 爱德泰科普 | 了解单模光纤跳线和多模光纤跳线,看着一篇就够了
- Latex更改参考文献格式
- chrome视频无法播放的解决方法(Solve the problem of Google player cannot be played normally)
- 自己开发了一个JsonViewer工具--FrogJson
- Ubuntu下常用的快捷键
- dw如何设置html图片大小,Dreamweaver如何设置图像属性?DW设置图像属性方法介绍
- C/C++函数传递二维数组
热门文章
- python作品_Python爬取图虫网摄影作品
- 怎样查看一个linux命令的概要与用法,Linux下yum命令概要与用法
- 程序员吐槽_阿里程序员回老家被哥们吐槽,破IT就破IT,还阿里巴巴
- java jconsole_java中jconsole命令的学习
- java web windows_Java Web服务器部署指南(windows版)
- mysql b 树 b树_MySQL B树和B+树的区别
- Django项目与中间件与celery
- 计算机考研:计算机组成原理考点分析
- JAVA 编程-张晨光-专题视频课程
- oracle常见问题