码迷,mamicode.com
首页 > Web开发 > 详细

对JS中函数的理解

时间:2017-02-21 22:08:14      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:val   代码   apply   span   ret   指针   调用   alert   type属性   

函数本质就是功能的集合

JS中函数是对象,因此,函数名实际上仅仅是一个指向函数对象的指针,不会与某个函数绑定,所以,JS中没有重载(重载就是通过传递不同类型的参数,使两个相同函数名的函数执行不同的功能)

var fn=function(a){return a+100;}
fn=function(a){return a+200;}
alert(fn(100));   //300

要访问函数的引用(指针)而不是执行函数时,必须去掉圆括号,加上圆括号表示访问函数执行后的结果

函数体内部的语句在执行时,一旦遇到return,函数就会结束(后面的代码不会执行),并返回返回值

返回值可以是任何类型的值,如果没有return或只有return而没有返回值,则函数返回默认值undefined

在函数内部,有两个特殊的对象arguments和this

  a.arguments是一个类似数组(但不是数组)的对象,用于保存函数的参数,即使函数定义时没有定义参数,arguments也会保存实际调用时使用的参数

  b.this表示当前函数执行的环境对象的引用

function fn(){return this;}
fn();

函数拥有两个属性length和prototype

  a.length表示希望接收的参数个数,而不是实际接收的

  b.prototype保存了引用类型的所有实例方法(tostring(),valueOf()等等),在ES5中,prototype属性是无法枚举的

函数拥有两个非继承而来的方法apply()和call(),这两个方法的作用都是在特定的作用域中调用函数实际上等于设置函数体内this对象的值

  a.apply()方法可以接收两个参数,一个是在其中运行函数的作用域,另一个时参数数组(可以没有),参数数组可以是Array的实例,也可以是arguments对象

  b.call()方法和apply()方法作用相同,但接收参数的方式不同,call()第二个参数只能是函数参数的数组形式,也就是说第二个参数必须一个一个列出来

这两个方法常用来扩充作用域

function fn1(a,b){return a+b;}
function fn2(a,b){return fn1.apply(this,arguments);}
alert(fn1(1,1));        //2
alert(fn2(1,1));        //2
function fn1(a,b){return a+b;}
function fn2(a,b){return fn1.apply(this,[a,b]);}
alert(fn1(1,1));        //2
alert(fn2(1,1));        //2
fn.call(window);       //fn在全局环境中执行
fn.call(this);           //fn在当前环境中执行

ES5中还定义了一个方法bind(),这个方法会创造一个函数的实例,其this值会被绑定到传给bind()方法的值

window.color=‘red‘;
var p={color:‘blue‘};
function fn(){alert(this.color);}
var fn0=fn.bind(p);
fn0();        //blue

  

  

 

对JS中函数的理解

标签:val   代码   apply   span   ret   指针   调用   alert   type属性   

原文地址:http://www.cnblogs.com/frontendnotes/p/6426126.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!