《JavaScript高级程序设计》5.5 Function类型
5.5 Function类型
函数实质上是对象, 每个函数都是Function类型的实例, 并且都和其他引用类型一样具有属性和方法.
因此函数名实际上也是一个指向函数对象的指针, 不会与某个函数绑定.
三种函数定义方法:
1. 函数声明:
function sum(num1, num2){
return num1 + num2;
}
2. 函数表达式:
var sum = function(num1, num2){
return num1 + num2;
};
3. 使用Function构造函数
var sum = new Function("num1", "num2", "return num1 + num2"); //不推荐
5.5.1 没有重载
5.5.2 函数声明与函数表达式
解析器会率先读取函数声明. 并使其在执行任何代码之前可用; 但对函数表达式, 则必须等到解析器执行到它所在的代码行,才会真正解释执行.
5.5.3 作为值的函数
5.5.4 函数内部属性
1) arguments
- 属性callee: 一个指针,指向拥有这个arguments对象的函数. 其实就是指向当前函数呗
//举个例子: 一个阶乘函数
function factorial(num){
if(num <= 1 ){
return 1;
} else {
return num * factorial(num-1);
}
}
//这个函数的执行与函数名紧耦合, 为了消除这种紧耦合,使用arguments.callee
function factorial(num){
if(num <= 1){
return 1;
} else {
return num * arguments.callee(num-1);
}
}
//这个重写后的factorial()函数的函数体内,没有再引用函数名. 这样,无论引用函数时使用什么名字,都可保证正常完成递归调用.对象this: 引用的是函数据以执行的环境对象-----当在网页的全局作用域中调用函数时,this对象引用的就是window
- ECMAScript 5 规范化了另一个函数对象的属性: caller. 这个属性中保存着调用当前函数的函数的引用, 如果是全局作用域中调用当前函数,它的值为null
function outer(){
inner();
}
function inner(){
alert(arguments.callee.caller); //arguments.callee == inner
}
outer(); //会显示outer()函数的源代码
严格模式下:
访问arguments.callee会导致错误.
ECMAScript 5 还定义了arguments.caller属性, 但在严格模式下访问它也会导致错误, 而在非严格模式下这个属性始终是undefined. 定义这个属性是为了分清arguments.caller和函数的caller属性
不能为函数的caller属性赋值, 否则会导致错误
5.5.5 函数属性和方法
- 每个函数都包含两个属性: length 和 prototype.
- 其中, length属性表示函数希望接收的命名参数的个数
- 每个函数都包含两个非继承而来的方法: apply 和 call
- 两个方法都是用于在特定的作用域中调用函数,实际上等于设置函数体内this对象的值.
- apply方法接收两个参数,一个是在其中运行函数的作用域, 另一个是参数数组. 参数数组可以是Array的实例, 也可以是arguments对象
- 对call方法而言, 第一个参数是this值没变,第二个参数是其余参数都直接传递给函数. 即传递给函数的参数必须逐个列举出来
- 使用call和apply方法来扩充作用域
- 好处: 对象不需要与方法有任何耦合关系
- ECMAScript 5 还定义了一个方法: bind(). 这个方法会创建一个函数的实例, 其this值会被绑定到传给bind()函数的值.
window.color = "red";
var o = { color: "blue"}; function sayColor(){
alert(this.color);
}
var objectSayColor = sayColor.bind(o);
objectSayColor(); //blue
- 每个函数继承的toLocaleString()和toString()方法始终都返回函数的代码.
- 另一个继承的valueOf()方法也同样只返回函数代码
《JavaScript高级程序设计》5.5 Function类型的更多相关文章
- 引用类型-Function类型
Function类型 定义函数的三种方式: 1.函数声明 function sum(num1,num2){ return num1 +num2; } 2.函数表达式 var sum = functio ...
- 【笔记】js Function类型 内部方法callee
运用function实现阶乘 以往的做法是如下的 function factorial(num){ if(num <= 1){ return 1; }else{ return num * fac ...
- Function类型
1.每个函数都是Function类型的,和其他引用类型一样都具有属性和方法.函数也是对象,因此函数实际上是一个指向函数对象的指针. 函数声明语法定义: 方法1: function sum(num1,n ...
- JavaScript笔记——引用类型之Object类型和Function类型
<JavaScript高级程序设计>中介绍的几种JavaScript的引用类型,本文只记了Object跟Function类型 Object类型 创建对象 var person = new ...
- String类型,Function类型
1.String类型: 1)创建String对象: var str=new String(s); String(s); 参数:参数 s 是要存储在 String 对象中的值或转换成 ...
- JavaScript高级 Function类型
· Function类型 (属于引用类型) 1.JS中,有的函数均是对象,这个一个非常有特点的地方.它既然是对象,那么它的构造函数是谁呢?就是Function.(例如:function Pers ...
- 浅析JavaScript之Function类型
JavaScript中的函数实际上是对象,每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上只是指向函数对象的指针,保存函数在堆内存中的地 ...
- 笔记——Function类型 及其 call、apply方法
每个函数都是Function类型的实例.函数有三种定义方式和两个内部属性arguments和this. 同时函数也是对象,也有属性和方法.本篇主要其call()和apply()方法 属性 length ...
- 引用类型之Function类型
Function类型 ECMAScript中最有意思的就是函数了,有意思的根源,在于函数实际上是对象.每个函数都是Function的实例,具有属性和方法.而重要的一点是,函数名,不过是指向函数的指针, ...
- 第十一章 Function类型
在ECMAScript中,Function(函数)类型实际上是对象.每个函数也是Function类型的实例,而且都与其它引用类型一样具有属性和方法.由于是函数对象,因此函数名实际上也是一个指向函数对象 ...
随机推荐
- Spring_AOP动态代理详解(转)
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
- discuz模板介绍
1.discuz目录下template为模板目录 模板套系 discuz每套模板,支持不同的风格,而多个风格组成一套套系. 推荐使用复制的方法创建新的风格 (*默认的公共页面静态资源,存储在discu ...
- How to add libraries to “External Libraries” in WebStorm/PhpStorm/Intellij
Stack Overflow Questions Developer Jobs Tags Users Log In Sign Up Join Stack Overflow to learn, sh ...
- Reactor 模型(一)基本并发编程模型
Reactor 模型(一)基本并发编程模型 Netty 系列目录 (https://www.cnblogs.com/binarylei/p/10117436.html) 在讲解 Reactor 线程模 ...
- dateframe_loc.iloc.ix
import pandas as pddf=pd.DataFrame({ "a":[1,2,3], "b":[4,5,6], "c":[7, ...
- 值得一看!2018年最优秀的9个Android Material Design Apps!
今年4月,谷歌Gmail推出了全新的设计外观,全新的配色方案,更多的空白区域和精致的图标.也带来了Material Design 的一些改变 – Material Theming (材料主题),旨在自 ...
- 递归生成treeview树形节点(没有用递归函数之后会有补充,这里只用系统的内置方法去生成)
using System;using System.Collections.Generic;using System.ComponentModel;using System.IO;using Syst ...
- android的 Base64
byte[] key=Base64.decode("YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4".getBytes(), Base64.DEFAULT); ...
- 2018.09.25 bzoj2286: [Sdoi2011]消耗战(虚树+树形dp)
传送门 又一道虚树入门题. 这个dp更简单啊. 直接记录每个点到1的距离,简单转移就行了. 代码: #include<bits/stdc++.h> #define N 250005 #de ...
- ABP框架 - 缓存( 转)
出处:http://www.cnblogs.com/kid1412/p/5987083.html 文档目录 本节内容: 简介 ICacheManager ICache ITypedCache 配置 实 ...