深入浅析JavaScript中的Function类型


Posted in Javascript onJuly 09, 2016

Function是javascript里最常用的一个概念,javascript里的function是最容易入手的一个功能,但它也是javascript最难理解最难掌握的一个概念。

1. Function类型是js中引用类型之一,每个函数实际上都是Function类型的实例对象,具有自己的属性和方法。正因为函数式对象,所以函数名实际上也是一个指向函数对象的指针。

2. 常用的函数定义方式

1. 函数声明:

function sum(a , b ){
return a+b;
}

2. 表达式:

var sum = function(){
return a+b; 
}; //注意分号
 //两种方式的区别:
 //解释器会率先读取函数声明,并使其在执行之前可以访问,而使用表达式则必须等到解析器执行到它所在的代码行,才会真正被解释执行(变量声明提前,而值留在原地)
alert (sum (10 ,10));
function sum(a ,b){
return a+b;
}
//↑上面的代码会正常执行,因为在代码执行前,解析器通过函数声明提升,读取并将函数声明添加到执行环境中,放到代码树的顶部
alert (typeof sum);
alert(sum(10 , 10));
var sum = function (a ,b){

return a+b;
}
//↑报错,原因在于函数位于一个初始化语句中,不是一个函数声明,不会被提前,而只会把var sum提前,用typeof操作符显示sum是undefined,所以报错

3. 函数名仅仅保存指向函数对象的指针,因此函数名与包含对象指针的其他变量没什么不同,也就是说,一个函数对象可以有多个名字:

function sum(a , b ){
return a+b;
}
console.log(sum(2 ,3)); //5
var anotherSum = sum; //变量anotherSum也指向了同一个函数对象
console.log(anotherSum(4 , 5)); //9
sum = null; //sum变量不再保存函数对象的指针了
console.log(anotherSum(1 , 3)); //anotherSum这个变量仍能调用

4. JS为何没有重载这个概念。

function add(a){
return a+3 ;
}
function add(a){
return a+5;
}
var result = add(3); //8
//两个函数同名了,结果只能是后一个函数覆盖前一个,所以不能重载

5. 函数的内部属性:函数内部,有两个特殊的对象,arguments和this

1. arguments:

arguments是个类数组对象,包含着传入函数的所有参数,这个对象有一个叫callee的属性,属性值是一个指针,指向拥有这个arguments对象的函数本身

function foo (){
var a =arguments.callee; 
return a.toString();
}
foo();
/*
返回结果:
"function sum(){

var a =arguments.callee; 

return a.toString();

}"
也就是说,一个函数内部,arguments.callee指的就是这个函数本身。这个函数在递归调用时有点用,有许多缺陷,在ES5严格模式被移除
*/

2. this:简单来说,this指的就是函数执行的环境对象,在哪个对象中执行,this就指哪个对象。展开来说比较复杂,单开一篇

//TODO:

3. ES5规范了函数的另一个属性:caller,这个函数属性指的是调用当前函数的函数

function inner(){
console.log(inner.caller);
} 
function outer(){
inner();
}
outer(); 
//function outer(){
inner();
}

4. length属性:表示函数希望接受的参数个数

function add(a ,b ,c){
return a+b+c;
}
add.length; //3

5. 著名的prototype属性,简单来说,是一个对象,是通过调用构造函数而创建的一个对象,包含可以由特定类型的所有实例共享的属性和方法。展开来说比较复杂,单开一篇

//TODO:

6. 函数的两个方法:call()和apply(),作用都是在特定的作用域中调用函数,实际上就是设置函数内部的this值

1. call():与apply()方法类似,区别在接收参数的方式不同,参数必须逐个列出来。

2. apply():接收两个参数,一个是函数运行的作用域,另一个是参数数组,可以是数组,也可以是arguments这个类数组对象

function sum(a , b){
return a+b;
}
function callSum(a , b){
return sum.apply(this , arguments);
}//第二个参数是一个类数组对象arguments
function callSum1(a , b){
return sum.apply(this, [a , b]);
} //第二个参数是一个数组
console.log(callSum(2 , 3)); //5 
console.log(callSum1(3 ,5)); //8

3. 传递参数并调用函数并非call()和apply()的用武之地,二者真正强大的地方是扩充函数运行的作用域

var color = 'red';
var obj = {
color :'blue' 
}
function foo(){
console.log(this.color); 
}
foo(); //'red'
foo.call(this);//'red'
foo.call(obj); //'blue'
//最后一次调用foo()函数的执行环境变了,其中的this指向了obj对象,所以是'blue'

 使用call()和apply()扩充作用域的最大好处,就是使对象与方法之间解耦

4. ES5定义了一个新方法:bind(),返回一个函数,这个函数中this值会被绑定到传给bind()函数的值

var x = 9; 
var module = {
x: 81,
getX: function() { return this.x; }
};
module.getX(); // 81
var retrieveX = module.getX;
retrieveX(); // 9, 因为在这种情况下, "this" 指向全局变量
var boundGetX = retrieveX.bind(module);//把retrieveX()函数中的this永远与module绑定,再调用这个函数永远都是在module对象中运行
boundGetX(); // 81

以上所述是小编给大家介绍的深入浅析JavaScript中的Function类型介绍,希望对大家有所帮助,如果大家想了解更多内容,敬请关注三水点靠木。

Javascript 相关文章推荐
JavaScript 编写匿名函数的几种方法
Feb 21 Javascript
用js编写的简单的计算器代码程序
Aug 04 Javascript
基于javascript实现浏览器滚动条快到底部时自动加载数据
Nov 30 Javascript
js改变css样式的三种方法推荐
Jun 28 Javascript
移动开发之自适应手机屏幕宽度
Nov 23 Javascript
Node.js如何实现注册邮箱激活功能 (常见)
Jul 23 Javascript
深入理解与使用keep-alive(配合router-view缓存整个路由页面)
Sep 25 Javascript
iView框架问题整理小结
Oct 16 Javascript
详解vue更改头像功能实现
Apr 28 Javascript
Vue中登录验证成功后保存token,并每次请求携带并验证token操作
Sep 08 Javascript
JavaScript实现串行请求的示例代码
Sep 14 Javascript
Vue3 Composition API的使用简介
Mar 29 Vue.js
JavaScript基础重点(必看)
Jul 09 #Javascript
jQuery获取同级元素的简单代码
Jul 09 #Javascript
JS添加删除DIV的简单实例
Jul 08 #Javascript
js操作DOM--添加、删除节点的简单实例
Jul 08 #Javascript
简单封装js的dom查询实例代码
Jul 08 #Javascript
JS选取DOM元素的简单方法
Jul 08 #Javascript
封装获取dom元素的简单实例
Jul 08 #Javascript
You might like
星际争霸秘籍
2020/03/04 星际争霸
php中的实现trim函数代码
2007/03/19 PHP
PHP高级OOP技术演示
2009/08/27 PHP
基于Linux调试工具strace与gdb的常用命令总结
2013/06/03 PHP
php定时计划任务与fsockopen持续进程实例
2014/05/23 PHP
PHP获取ip对应地区和使用网络类型的方法
2015/03/11 PHP
解决PHP里大量数据循环时内存耗尽的方法
2015/10/10 PHP
thinkPHP5分页功能实现方法分析
2017/10/25 PHP
php 函数中静态变量使用的问题实例分析
2020/03/05 PHP
Jquery实战_读书笔记1—选择jQuery
2010/01/22 Javascript
得到jQuery detach()后节点中的某个值实现代码
2013/02/05 Javascript
JS和Jquery获取和修改label的值的示例代码
2014/01/15 Javascript
jQuery 无限级菜单的简单实例
2014/02/21 Javascript
js实现按钮加背景图片常用方法
2014/11/01 Javascript
JQuery仿小米手机抢购页面倒计时效果
2014/12/16 Javascript
JavaScript中split() 使用方法汇总
2015/04/17 Javascript
js实现图片缓慢放大缩小效果
2016/08/02 Javascript
Angular2从搭建环境到开发步骤详解
2016/10/17 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
2017/07/12 Javascript
JS兼容所有浏览器的DOMContentLoaded事件
2018/01/12 Javascript
详解nodejs通过响应回写的方式渲染页面资源
2018/04/07 NodeJs
Vue子组件向父组件通信与父组件调用子组件中的方法
2018/06/22 Javascript
vue中格式化时间过滤器代码实例
2019/04/17 Javascript
了解JavaScript中let语句
2019/05/30 Javascript
Vue状态模式实现窗口停靠功能(灵动、自由, 管理后台Admin界面)
2020/03/06 Javascript
python实现读取命令行参数的方法
2015/05/22 Python
Python 模块EasyGui详细介绍
2017/02/19 Python
用python实现对比两张图片的不同
2018/02/05 Python
mac下pycharm设置python版本的图文教程
2018/06/13 Python
Python Json数据文件操作原理解析
2020/05/09 Python
同步和异步有何异同,在什么情况下分别使用他们
2013/04/09 面试题
医学求职自荐信
2014/06/21 职场文书
促销活动总结怎么写
2014/06/25 职场文书
青年教师师德演讲稿
2014/08/26 职场文书
一份恶作剧的检讨书
2014/09/13 职场文书
python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)
2021/04/12 Python