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类型相关推荐

  1. JavaScript面向对象之Function类型

    JavaScript面向对象之Function类型 下面是我对Function类型的总结,希望对您有帮助. "函数式编程"是一种"编程范式"(programmi ...

  2. Function类型(函数)

    Function类型 1.函数实际上是对象,函数名是指向函数对象的指针,因此函数名与其他指向该函数的变量没有什么不同. 比如: function func (){console.log("f ...

  3. 《JavaScript高级程序设计 (第3版)》学习笔记14:chapter_5 - 5 Function类型

    这是第14篇笔记! 让学习"上瘾",成为更好的自己! <!DOCTYPE html> <html lang="en"> <head ...

  4. 【笔记】js Function类型 内部方法callee

    运用function实现阶乘 以往的做法是如下的 function factorial(num){if(num <= 1){return 1;}else{return num * factori ...

  5. JavaScript之function类型

    每个函数都是function类型的实例 function name() var name= function() 转载于:https://www.cnblogs.com/anderson0/p/482 ...

  6. 【js实例】Array类型的9个数组方法,Date类型的41个日期方法,Function类型

    前文提要:[js实例]js中的5种基本数据类型和9种操作符 Array类型的9个数组方法 Array中有9个数组方法: 1.检测数组 2.转换方法 3.栈方法 4.队列方法 5.冲排序方法 6.操作方 ...

  7. Function类型(JS高程3)—— JS学习笔记2015-6-29(第70天)

    Function 类型 函数是对象 具有属性和方法,函数名实际上是一个指向函数对象的指针 没有重载: 函数声明和函数表达式 函数声明: function sum (num1, num2){ retur ...

  8. javascript学习笔记 - 引用类型 Function

    五 Function类型 每个函数都时Function类型的实例.函数也是对象. 声明函数: function func_name () {} //javascript解析器会在程序执行时率先读取函数 ...

  9. JavaScript的Function 类型

    一,Function定义 Function实际上是对象,与其他引用类型一样具有属性和方法.Function可以通过三种方法进行定义,分别是函数声明语法定义,函数表达式定义和Function构造函数定义 ...

  10. ECMAScript 5 —— Function 类型 (四)

    本篇文章聊聊函数属性和方法 . 四. 函数属性和方法 前面博文曾经提到过,ECMAScript 中的函数是对象,因此函数也有属性和方法.每个函数都包含两个属性:length 和 prototype.其 ...

最新文章

  1. 智能物联网(AIoT,2020年)(下)
  2. aws lambda_为什么我会自动删除所有旧的推文以及我用来执行此操作的AWS Lambda函数...
  3. 阿里云服务器ubuntu14.04安装Redis
  4. 说下js中的bind
  5. Git各区的添加与撤销[实际操作验证]
  6. html 在tomcat中访问不到_安全服务之安全基线及加固(四)Tomcat篇
  7. python可变类型做默认参数
  8. 问号匹配,带元组规则的位置匹配不到
  9. 小米5主板原理图_小米5手机拆解及评测 小米5拆机详细图解教程
  10. C语言实现快速排序算法
  11. RoadRunner软件初步使用教程
  12. dux修改index.php,DUX主题修改首页轮播图为通栏模式
  13. 几何分布的期望和方差公式推导_GPR(高斯过程回归)详细推导
  14. mysqlin查询的java写法_[转载]常用的shell脚本
  15. 幼儿抽象逻辑思维举例_幼教科目二丨幼儿认知的发展(思维)
  16. spring中读不到配置文件问题
  17. 强制重启计算机快捷键,强制重启电脑快捷键
  18. Hadoop学习笔记(一)
  19. vue封装图片滑块验证+读秒组件
  20. 如何在 Pandas DataFrame 中插入一行

热门文章

  1. JSBinding + SharpKit / JavaScript 加载流程
  2. APP软件半成品测试技巧
  3. uboot之uboot.lds文件分析
  4. RequiredFieldValidator控件--必填验证控件
  5. 特殊字符搜索网站 http://symbolhound.com/
  6. 数家韩国银行出现网路钓鱼网站
  7. JSP之【include】指令
  8. 创建Maven项目时提示web.xml is missing and failOnMissingWebXml is set to true错误解决方案
  9. 再见,Python!你好,Go语言\n\n
  10. Qt5 QtQuick系列----QtQuick的Secne Graph剖析(1)