深入浅析JavaScript中的Function类型
前端之家收集整理的这篇文章主要介绍了
深入浅析JavaScript中的Function类型,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_301_0@Function是javascript里最常用的一个概念,javascript里的function是最容易入手的一个功能,但它也是javascript最难理解最难掌握的一个概念。
@H_
301_0@1. Function类型是js中引用类型之一,每个
函数实际上都是Function类型的实例对象,具有自己的
属性和
方法。正因为
函数式对象,所以
函数名实际上也是一个指向
函数对象的指针。
@H_
301_0@2. 常用的
函数定义方式
@H_
301_0@1.
函数声明:
<div class="jb51code">
<pre class="brush:js;">
function sum(a,b ){
return a+b;
}
@H_
301_0@2. 表达式:
函数声明,并使其在执行之前可以访问,而使用表达式则必须等到解析器执行到它所在的
代码行,才会真正被解释执行(变量声明提前,而值留在原地)
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,所以报错
@H_
301_0@3.
函数名仅仅保存指向
函数对象的指针,因此
函数名与包含对象指针的其他变量没什么不同,也就是说,一个
函数对象可以有多个名字:
函数对象
console.log(anotherSum(4,5)); //9
sum = null; //sum变量不再保存
函数对象的指针了
console.log(anotherSum(1,3)); //anotherSum这个变量仍能
调用
@H_
301_0@4. JS为何没有重载这个概念。
函数同名了,结果只能是后一个
函数覆盖前一个,所以不能重载
@H_
301_0@5.
函数的内部
属性:
函数内部,有两个特殊的对象,arguments和this
@H_
301_0@ 1. arguments:
@H_
301_0@ arguments是个类数组对象,包含着传入
函数的所有参数,这个对象有一个叫callee的
属性,
属性值是一个指针,指向拥有这个arguments对象的
函数本身
函数内部,arguments.callee指的就是这个
函数本身。这个
函数在递归
调用时有点用,有许多缺陷,在ES5严格模式被移除
*/
@H_
301_0@ 2. this:简单来说,this指的就是
函数执行的环境对象,在哪个对象中执行,this就指哪个对象。展开来说比较复杂,单开一篇
@H_
301_0@//TODO:
@H_
301_0@ 3. ES5规范了
函数的另一个
属性:caller,这个
函数属性指的是
调用当前
函数的
函数
@H_
301_0@ 4. length
属性:表示
函数希望接受的参数个数
@H_
301_0@ 5. 著名的prototype
属性,简单来说,是一个对象,是通过
调用构造
函数而创建的一个对象,包含可以由特定类型的所有实例共享的
属性和
方法。展开来说比较复杂,单开一篇
@H_
301_0@//TODO:
@H_
301_0@6.
函数的两个
方法:call()和apply(),作用都是在特定的作用域中
调用函数,实际上就是设置
函数内部的this值
@H_
301_0@ 1. call():与apply()
方法类似,区别在接收参数的方式不同,参数必须逐个列出来。
@H_
301_0@ 2. apply():接收两个参数,一个是
函数运行的作用域,另一个是参数数组,可以是数组,也可以是arguments这个类数组对象
@H_
301_0@ 3. 传递参数并
调用函数并非call()和apply()的用武之地,二者真正强大的地方是扩充
函数运行的作用域
调用foo()
函数的执行环境变了,其中的this指向了obj对象,所以是'blue'
@H_
301_0@ 使用call()和apply()扩充作用域的最大好处,就是使对象与
方法之间解耦
@H_
301_0@ 4. ES5定义了一个新
方法:bind(),返回一个
函数,这个
函数中this值会被绑定到传给bind()
函数的值
全局变量
var boundGetX = retrieveX.bind(module);//把retrieveX()
函数中的this永远与module绑定,再
调用这个
函数永远都是在module对象中运行
boundGetX(); // 81
@H_
301_0@以上所述是小编给大家介绍的深入浅析JavaScript中的Function类型介绍,希望对大家有所帮助,如果大家想了解更多
内容,敬请关注编程之家。