引用类型-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)); //20var another = sum; alert(another(10,10)); //20sum = null; alert(another(10,10)); //20sum和another都指向同一个函数,所以讲sum设置为null并不影响another
注意:使用不带圆括号的函数名是访问函数指针,并不是调用函数
没有重载
将函数名理解为指针有利于理解为什么没有重载
function addSomeNumber(num){ return num + 100;}function addSomeNumber(num){ return num + 200;} alert(addSomeNumber(100)); //300
第二个函数将addSomeNumber指向新的函数
函数声明与函数表达式
解析器在向执行环境中加载数据时,对函数声明和函数表达式不是一时同仁。解析器会率先读取函数声明,并使其在执新行任何代码之前可用。对于函数表达式,则必须等到执行到它所在的代码行,才会真正被解析。
alert(sum(10.10)); //20function sum(num1,num2){ return num1 +num2;}
在代码执行环境之前,解析器会通过一个名为函数声明提升的过程,读取并将函数声明添加到执行环境当中。对代码求值时,JavaScript引擎在第一遍会声明函数并将它们放到源代码树的顶部
alert(sum(10,10)); sum = (num1,num2){ num1 + num2;}
作为值的函数
可以像传递参数一样把一个函数传递给另一个函数,也可以将一个函数作为另一个函数的结果返回。
function callSomeFunction(someFunction,someArugment){ return someFunction(someArugment);}function add10(num){ return num + 10;}var result = callSomeFunction(add10,10); alert(result);//20
可以从一个函数中返回另一个函数
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; elsereturn 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; elsereturn num * factorial(num-1);}
函数有一个问题,函数的执行与函数名耦合在了一起
改进:
function factorial(num){ if(num<=1) return 1; elsereturn num * arguments.callee(num-1);}var trueFactorial = factorial; factorial = function(){ return 0;} alert(trueFactorial(5)); //120alert(factorial(5)); //0
this引用的是函数数据以执行的环境对象或者也可以说是this值(当在网页的全局作用域中调用函数时this对象引用的是window)
window.color = "red";var o = {color:"blue"};function sayColor(){alert(this.color);} sayColor(); //redo.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); //2
对于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)); //20alert(callSum2(10,10)); //20
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)); //20
其实call()和apply()真正强大的地方在于能够扩充函数赖以运行的作用域
window.color = "red"; var o = {color:"blue"}; function sayColor(){alert(this.color);}sayColor(); //redsayColor.call(this); //redsayColor.call(window); //redsayColor.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()方法会始终返回函数的代码。
转载于:https://blog.51cto.com/12879490/1921528
引用类型-Function类型相关推荐
- JavaScript面向对象之Function类型
JavaScript面向对象之Function类型 下面是我对Function类型的总结,希望对您有帮助. "函数式编程"是一种"编程范式"(programmi ...
- Function类型(函数)
Function类型 1.函数实际上是对象,函数名是指向函数对象的指针,因此函数名与其他指向该函数的变量没有什么不同. 比如: function func (){console.log("f ...
- 《JavaScript高级程序设计 (第3版)》学习笔记14:chapter_5 - 5 Function类型
这是第14篇笔记! 让学习"上瘾",成为更好的自己! <!DOCTYPE html> <html lang="en"> <head ...
- 【笔记】js Function类型 内部方法callee
运用function实现阶乘 以往的做法是如下的 function factorial(num){if(num <= 1){return 1;}else{return num * factori ...
- JavaScript之function类型
每个函数都是function类型的实例 function name() var name= function() 转载于:https://www.cnblogs.com/anderson0/p/482 ...
- 【js实例】Array类型的9个数组方法,Date类型的41个日期方法,Function类型
前文提要:[js实例]js中的5种基本数据类型和9种操作符 Array类型的9个数组方法 Array中有9个数组方法: 1.检测数组 2.转换方法 3.栈方法 4.队列方法 5.冲排序方法 6.操作方 ...
- Function类型(JS高程3)—— JS学习笔记2015-6-29(第70天)
Function 类型 函数是对象 具有属性和方法,函数名实际上是一个指向函数对象的指针 没有重载: 函数声明和函数表达式 函数声明: function sum (num1, num2){ retur ...
- javascript学习笔记 - 引用类型 Function
五 Function类型 每个函数都时Function类型的实例.函数也是对象. 声明函数: function func_name () {} //javascript解析器会在程序执行时率先读取函数 ...
- JavaScript的Function 类型
一,Function定义 Function实际上是对象,与其他引用类型一样具有属性和方法.Function可以通过三种方法进行定义,分别是函数声明语法定义,函数表达式定义和Function构造函数定义 ...
- ECMAScript 5 —— Function 类型 (四)
本篇文章聊聊函数属性和方法 . 四. 函数属性和方法 前面博文曾经提到过,ECMAScript 中的函数是对象,因此函数也有属性和方法.每个函数都包含两个属性:length 和 prototype.其 ...
最新文章
- 智能物联网(AIoT,2020年)(下)
- aws lambda_为什么我会自动删除所有旧的推文以及我用来执行此操作的AWS Lambda函数...
- 阿里云服务器ubuntu14.04安装Redis
- 说下js中的bind
- Git各区的添加与撤销[实际操作验证]
- html 在tomcat中访问不到_安全服务之安全基线及加固(四)Tomcat篇
- python可变类型做默认参数
- 问号匹配,带元组规则的位置匹配不到
- 小米5主板原理图_小米5手机拆解及评测 小米5拆机详细图解教程
- C语言实现快速排序算法
- RoadRunner软件初步使用教程
- dux修改index.php,DUX主题修改首页轮播图为通栏模式
- 几何分布的期望和方差公式推导_GPR(高斯过程回归)详细推导
- mysqlin查询的java写法_[转载]常用的shell脚本
- 幼儿抽象逻辑思维举例_幼教科目二丨幼儿认知的发展(思维)
- spring中读不到配置文件问题
- 强制重启计算机快捷键,强制重启电脑快捷键
- Hadoop学习笔记(一)
- vue封装图片滑块验证+读秒组件
- 如何在 Pandas DataFrame 中插入一行
热门文章
- JSBinding + SharpKit / JavaScript 加载流程
- APP软件半成品测试技巧
- uboot之uboot.lds文件分析
- RequiredFieldValidator控件--必填验证控件
- 特殊字符搜索网站 http://symbolhound.com/
- 数家韩国银行出现网路钓鱼网站
- JSP之【include】指令
- 创建Maven项目时提示web.xml is missing and failOnMissingWebXml is set to true错误解决方案
- 再见,Python!你好,Go语言\n\n
- Qt5 QtQuick系列----QtQuick的Secne Graph剖析(1)