JS Function类型
每个函数都是Function类型的实例,由于函数是对象,函数名实际上是一个指向函数对象的指针,不会与某个函数绑定。
1.函数的声明:
(1)函数声明语法:
function sum (num1,num2) {
return num1 + num2;
}
(2)函数表达式语法:
var sum = function (num1,num2) {
return num1+num2
};
(3)由于函数也是对象,所以也可以用构造函数声明
var sum = new Function("num1","num2","return num1+num2"); // 可以接收任意数量参数,最后一个参数被看成函数体
// 不推荐使用,因为解析了两次代码,首先要解析ECMAScript代码,然后解析传入的字符串
2.函数没有重载
因为函数名是指针,声明同名函数只是改变了指针的指向
3.函数声明与函数表达式
函数声明会发生变量提升,而函数表达式不会,一定得等js解析到函数所在语句才有效
4.函数内部属性
在函数内部,有两个特殊的对象,arguments和this
(1)arguments是一个类数组对象,包含着传入函数的所有参数,主要用途是保存函数参数
arguments对象还有一个属性,callee 指针,指向拥有这个arguments对象的函数
callee 可以用在递归中,消除函数名与函数执行紧紧耦合的现象
比如常见递归
function factorial(num) {
if(num <= 1) {
return 1;
} else {
return num*factorial(num-1);
}
}
可以把上述return 语句写为 return num*arguments.callee(num-1)
当函数被赋给其他变量,即有另一个指针也指向函数,此时改写原函数,对另一个指针调用不会产生影响。
(2)this 引用的是函数执行的环境对象,(当在网页的全局作用域调用时this对象引用的就是window)
5.函数属性和方法
每个函数有两个属性length 和 prototype
lengh表示函数希望接收的命名参数的个数
方法: 设置函数体内this对象的值
(1)apply() 接收两个参数,一个是在其中运行函数的作用域,一个是参数数组,可以是Array实例,也可以是arguments对象
在严格模式下,若没有指定环境对象而调用函数,this值不会转型为window,除非明确使用apply或call方法,否则this将为undefined
(2)call()方法与apply()作用相同,他们的区别在于接收参数不同,call接收其余所有参数,传递的参数必须逐个列举出来
call 和 apply 最大的作用其实是扩充函数赖以运行的作用域
如下例子:
window.color = 'red';
var o = {color : 'blue'};
function sayColor() {
alert(this.color);
}
sayColor(); // red
sayColor.call(this); // red
sayColor.call(window); //red
sayColor.call(o); // blue
此处sayColor()是定义在全局中的函数,自身运行输出red很正常,
然后通过call 绑定到this,window 都是一样的
最后绑定到 o 对象上 为blue 也好理解
相比于把函数加入到o对象中 o.sayColor = sayColor
这种方法解除了 方法与对象的联系(耦合)
(3)ECMAScript5 还定义了一个bind()方法,会创建一个函数的实例,其this值会被绑定到传给bind()函数的值
window.color = 'red';
var o = {color: "blue"};
function sayColor () {
alert(this.color)
}
var objectSayColor = sayColor.bind(o);
objectSayColor(); //blue
this值被绑定到o对象上,然后通过sayColor创建的实例赋给objectSayColor,所以objectSayColor 函数的this值也为o
JS Function类型的更多相关文章
- 【笔记】js Function类型 内部方法callee
运用function实现阶乘 以往的做法是如下的 function factorial(num){ if(num <= 1){ return 1; }else{ return num * fac ...
- JS—Function类型
1.函数的声明方式有三种普通函数的声明方式function box(num1,num2){ return num1+num2;}alert(box(1,2)); 使用变量初始化函数var box = ...
- 【js实例】Array类型的9个数组方法,Date类型的41个日期方法,Function类型
前文提要:[js实例]js中的5种基本数据类型和9种操作符 Array类型的9个数组方法 Array中有9个数组方法: 1.检测数组 2.转换方法 3.栈方法 4.队列方法 5.冲排序方法6.操作方法 ...
- js判断类型方法
在JavaScript中,有5种基本数据类型和1种复杂数据类型,基本数据类型有:Undefined, Null,Boolean, Number和String:复杂数据类型是Object,Object中 ...
- JavaScript高级 Function类型
· Function类型 (属于引用类型) 1.JS中,有的函数均是对象,这个一个非常有特点的地方.它既然是对象,那么它的构造函数是谁呢?就是Function.(例如:function Pers ...
- JavaScript中的Function类型浅析
1. Function类型是js中引用类型之一,每个函数实际上都是Function类型的实例对象,具有自己的属性和方法.正因为函数式对象,所以函数名实际上也是一个指向函数对象的指针. 2. 常用的函数 ...
- JavaScript之Function类型
1. 创建方式 //1.函数声明 function sum(num1,num2){ return num1+num2; } //2.函数表达式 var sum = function(num1,num2 ...
- Javascript高级编程学习笔记(16)—— 引用类型(5) Function类型
JS中许多有趣的地方都和函数脱不了联系 那么是什么让JS中的函数这么有趣呢? 我们一起来看看吧 Function类型 在JS中函数实际上就是对象,每个函数都是Function类型的实例,和JS的其他引 ...
- JS 强制类型转化
在Js中, 强制类型转化分为两种情况: 一种是引用类型转化基本类型, 如数组转化成数字:一种是两种不同基本类型之间的转化,如字符串转化为数字.你不能将基本类型转化成引用类型,比如,不可能把数字转化为数 ...
随机推荐
- urls.py路由系统分发的本质
路由系统分发的本质 反向生成redirect跳转url 1.在urls.py中指定url的name from django.conf.urls import url from django.contr ...
- SqlServer 四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介
CREATE TABLE [dbo].[Order]( [ID] [int] IDENTITY(1,1) NOT NULL, [UserId] [int] NOT NULL, [TotalPrice] ...
- vi不保存退出
To quit the vi editor without saving any changes you've made If you are currently in insert or appen ...
- WARN Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect (org.apache.zookeeper.ClientCnxn) java.net.ConnectException: Connection refused
1.启动kafka的脚本程序报如下所示的错误: [hadoop@slaver1 script_hadoop]$ kafka-start.sh start kafkaServer... [-- ::,] ...
- 山寨版 WP8.1 Cortana 启动 PC
8.1 dev preview 发布以来 Cortana 很受关注 前一段看到有视频演示用 Cortana 来启动 PC 看视频也是启动第三方应用实现的,简单来弄其实就是个语音启动应用 + 网络唤醒么 ...
- [转]oracle分页用两层循环还是三层循环?
select t2.* from --两层嵌套 (select t.* , rownum as row_numfrom t where rownum <=20) t2 where t2.row_ ...
- 【AtCoder】ARC077
C - pushpush 如果是按下标说的话 如果是偶数个 那么是 \(N,N - 2,N - 4...1,3,5...N - 1\) 如果是奇数个 \(N,N - 2,N - 4...2,4,6.. ...
- WPF中矢量图制作和引用
WPF程序有时需要适配不同大小的屏幕,图片是像素图的话,拉伸之后会变模糊,影响美观度,因此可以考虑使用矢量图.网上找到了相应的介绍:http://learnwpf.com/post/2006/06/0 ...
- Python_set集合部分功能介绍
set:无序集合,不能出现重复的元素 set的创建:s1=set() #访问速度快 #解决重复问题 x.add():添加一个新的元素,添加的重复的元素自动过滤掉 x.clear():清空集合 x.di ...
- Flink的Windows
在讲解windows的众多操作之前,需要讲解一个概念: 源源不断的数据流是无法进行统计工作的,因为数据流没有边界,就无法统计到底有多少数据经过了这个流.也无法统计数据流中的最大值,最小值,平均值,累加 ...