引用类型-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");
注意:函数名仅仅是指向函数的指针,因此函数名与其他包含对象的指针没有设么区别
function sum(num1,num2){
return num1 + num2;
}
alert(sum(10,10)); // var another = sum;
alert(another(10,10)); // sum = null;
alert(another(10,10)); //
sum和another都指向同一个函数,所以讲sum设置为null并不影响another
注意:使用不带圆括号的函数名是访问函数指针,并不是调用函数
没有重载
将函数名理解为指针有利于理解为什么没有重载
function addSomeNumber(num){
return num + 100;
}
function addSomeNumber(num){
return num + 200;
}
alert(addSomeNumber(100)); //
第二个函数将addSomeNumber指向新的函数
函数声明与函数表达式
解析器在向执行环境中加载数据时,对函数声明和函数表达式不是一时同仁。解析器会率先读取函数声明,并使其在执新行任何代码之前可用。对于函数表达式,则必须等到执行到它所在的代码行,才会真正被解析。
alert(sum(10.10)); //
function sum(num1,num2){
return num1 +num2;
}
在代码执行环境之前,解析器会通过一个名为函数声明提升的过程,读取并将函数声明添加到执行环境当中。对代码求值时,JavaScript引擎在第一遍会声明函数并将它们放到源代码树的顶部
alert(sum(10,10)); //产生错误,因为在与函数位于一个初始化语句中,而不是一个函数声明
var sum = function(num1,num2){
return num1 + num2;
}
作为值的函数
可以像传递参数一样把一个函数传递给另一个函数,也可以将一个函数作为另一个函数的结果返回。
function callSomeFunction(someFunction,someArugment){
return someFunction(someArugment);
} function add10(num){
return num + 10;
} var result = callSomeFunction(add10,10);
alert(result);//
可以从一个函数中返回另一个函数
function createComparisonFunction(propertyName){
return function(object1,object2){
var values1 = object1[propertyName];
var values2 = object2[propertyName];
if(values1<values2)
return -1;
else if(values1>values2)
return 1;
else
return 0;
};
}
var data = [{name:"qunzhu",age:21},{name:"huishuai",age:22},{name:"kuolang",age:23}];
data.sort(createComparisonFunction(name));
alert(data[1].name); //huishuai
函数内部属性
在函数内部,有两个特殊的对象:arguments和this。
arguments他是一个类数组对象,包含着传入函数中所有的参数,他有一个callee属性,该属性是一个指针,指向拥有这个arguments对象的函数。
function factorial(num){
if(num<=1)
return 1;
else
return num * factorial(num-1);
}
函数有一个问题,函数的执行与函数名耦合在了一起
改进:
function factorial(num){
if(num<=1)
return 1;
else
return num * arguments.callee(num-1);
}
var trueFactorial = factorial;
factorial = function(){
return 0;
}
alert(trueFactorial(5)); //
alert(factorial(5)); //
this引用的是函数数据以执行的环境对象或者也可以说是this值(当在网页的全局作用域中调用函数时this对象引用的是window)
window.color = "red";
var o = {color:"blue"};
function sayColor(){
alert(this.color);
}
sayColor(); //red
o.sayColor = sayColor;
o.sayColor(); //blue
ECMAScript5也规范化了另一个函数对象的属性:caller,这个属性保存着调用当前函数的函数的引用,如果在全局作用域中调用当前函数,则返回null。
function outer(){
inner();
}
function inner(){
alert(inner.caller);
}
outer();//会弹出警告框,显示outer()的源代码
函数属性和方法
每个函数都有两个属性:length和prototype
length属性表示函数希望接受的命名参数
function sum(num1,num2){
return num1 + num2;
}
alert(sum.length); //
对于ECMAScript中的引用类型而言,prototype是保存他们所有实例方法的真正所在,prototype的属性是不可枚举的,因此使用for-in无法发现
每个函数都包含两个非继承的方法:apply()和call()。这两个方法的用途都是在指定的作用域中调用函数,实际上等于设置函数体内的this对象的值
function sum(num1,num2){
return num1 + num2;
} function callSum1(num1,num2){
return sum.apply(this,arguments);
} function callSum2(num1,num2){
return sum.apply(this,[num1,num2]);
}
alert(callSum1(10,10)); //
alert(callSum2(10,10)); //
call()方法与apply()方法的作用相同,他们的区别在于接受参数的方式不同,call()方法,第一个参数时this值没有变化,变化的是其余参数都直接传递给函数。换句话说,在使用call()方法时,传递给函数的参数必须逐个列举出来
function sum(num1,num2){
return num1 + num2;
}
function callSum(num1,num2){
return sum.call(this,num1,num2);
}
alert(callSum(10,10)); //
其实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
ECMAScript5还定义了一个方法bind()。这个方法会创建一个函数的实例,起this值会绑定到传给bind()函数的值
window.color = "red";
var o = {color:"blue"};
function sayColor(){
alert(this.color);
}
var objectSayColor = sayColor.bind(o);
objectSayColor(); //blue
每个函数继承的toLocaleString()和toString()方法会始终返回函数的代码。
引用类型-Function类型的更多相关文章
- 引用类型--Function类型(函数声明与函数表达式、arguments.callee、caller、apply、call、bind)
在ECMAScript中函数实际上是对象.每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定 ...
- JavaScript笔记——引用类型之Object类型和Function类型
<JavaScript高级程序设计>中介绍的几种JavaScript的引用类型,本文只记了Object跟Function类型 Object类型 创建对象 var person = new ...
- 引用类型之Function类型
Function类型 ECMAScript中最有意思的就是函数了,有意思的根源,在于函数实际上是对象.每个函数都是Function的实例,具有属性和方法.而重要的一点是,函数名,不过是指向函数的指针, ...
- Javascript高级编程学习笔记(16)—— 引用类型(5) Function类型
JS中许多有趣的地方都和函数脱不了联系 那么是什么让JS中的函数这么有趣呢? 我们一起来看看吧 Function类型 在JS中函数实际上就是对象,每个函数都是Function类型的实例,和JS的其他引 ...
- 引用类型(三):Function类型
一. Function类型函数实际上是对象.每个函数都是Function类型都实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象都指针.1.函数通常是使 ...
- 小红书第五章——引用类型之function类型
有趣的函数——function类型 函数实际上是对象,每个函数都是function类型的实例,具有属性和方法. 1.函数的定义方法 1)函数声明语法 function sum(num1,num2){/ ...
- Function类型
1.每个函数都是Function类型的,和其他引用类型一样都具有属性和方法.函数也是对象,因此函数实际上是一个指向函数对象的指针. 函数声明语法定义: 方法1: function sum(num1,n ...
- String类型,Function类型
1.String类型: 1)创建String对象: var str=new String(s); String(s); 参数:参数 s 是要存储在 String 对象中的值或转换成 ...
- JavaScript高级 Function类型
· Function类型 (属于引用类型) 1.JS中,有的函数均是对象,这个一个非常有特点的地方.它既然是对象,那么它的构造函数是谁呢?就是Function.(例如:function Pers ...
随机推荐
- 使用canal分析binlog(一) 入门
canal介绍 canal是应阿里巴巴存在杭州和美国的双机房部署,存在跨机房同步的业务需求而提出的.早期,阿里巴巴B2B公司因为存在杭州和美国双机房部署,存在跨机房同步的业务需求.不过早期的数据库同步 ...
- bootstrap之移动支持
为了让 Bootstrap 开发的网站对移动设备友好,确保适当的绘制和触屏缩放,需要在网页的 head 之中添加 viewport meta 标签,如下所示: <meta name=" ...
- Python 爬虫6——Scrapy的安装和使用
前面我们简述了使用Python自带的urllib和urllib2库完成的一下爬取网页数据的操作,但其实能完成的功能都很简单,假如要进行复制的数据匹配和高效的操作,可以引入第三方的框架,例如Scrapy ...
- Android app应用多语言切换功能实现
最近在做一个多语言切换的功能,类似于微信的语言切换,搜了下资料基本上都是以下这种: 1. 实现的效果 和微信类似,在设置界面打开切换语言的界面,选择语言后重启 HomeActivity,语言切换完成, ...
- pythonchallenge 解谜 Level 2
好吧,赶紧贴一下. #-*- coding:utf-8 -*- #代码版本均为python 3.5.1 #Level 2 import re file = open("Level 2.txt ...
- eclipse插件开发入门
2016-09-09 17:11:50 1. 概述 1.1 SWT/JFace 是Eclipse 的基础,Eclipse 的 Workbench 就是建立在 SWT/JFace 之上的.另外,JFac ...
- Oracle EBS - Doc
Oracle EBS spec.: http://vianet/IT/IT%20Dept/IT%20Project%20Update2/Active%20Projects%20%20Manufactu ...
- 浅谈Js对象的概念、创建、调用、删除、修改!
一.我们经常困惑,对象究竟是什么,其实这是一种思维,一种意识上的东西,就像我们都说 世界是有物质组成的道理一样,理解了下面的几句话!对象也不是那么抽象! 1.javascript中的所有事 ...
- WPF之命令浅谈
一.认识命令 1.1命令的特点 提到“命令”,我们应该想到命令的发出者,命令的接受者,命令的内容,准备工作,完成任务,回报工作...与事件中的发送者,接受者,消息,处理,处理,处理一一对应,如果是单纯 ...
- 新书到手 TRANSACTION PROCESSING:CONCEPTS AND TECHNIQUES
新书到手 TRANSACTION PROCESSING:CONCEPTS AND TECHNIQUES Jim Gray大神的著作 本文版权归作者所有,未经作者同意不得转载.