javascript代码实例教程-javascript引用类型――Function类型(特性)解析

发布时间:2019-01-15 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了javascript代码实例教程-javascript引用类型――Function类型(特性)解析脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
小宝典致力于为广大程序猿(媛)提供高品质的代码服务,请大家多多光顾小站,小宝典在此谢过。

javascript引用类型——Function类型(特性)解析。函数是属于引用对象的一种,每个函数都是Function类型的实例,而且和其他引用类型一样具有属性和方法。因此,函数名实际上是一个指向函数对象的一个指针,也可以理解为索引,不会与某个函数绑定。 函数通常使用声明语法定义。如 function sum (n1,n2){ return n1+n2; } 还有另外一个定义方式,作用效果与上例差不多 : VAR sum = function (n1,n2){ return n1+n2; }; 但两者还是存在一定的区别,在的第二种的function关键字后面没有函数名,这是因为在使用函数表达式定义函数的时候,没必要使用函数名,通过变量可以引用函数。另外,注意函数末尾有一个分号借宿,就像声明变量时候一样。

还有另外一种方式就是用function的构造函数来定义,function可以接受多个参数,并认为最后一个参数始终是函数体,而前面的参数就是枚举出来的参数。 例子: var sum = new Function(){"n1","n2","return n1+n2"}; //建议不要使用 从语法角度来说,这个是一个函数的表达式,但是这种定义方法会导致解析执行两次代码(第一次是解析常规ECMAScript代码,第二次是解析传入构造函数的字符串。)从而影响性能,所以建议不要使用。

由于函数名只是指向函数的指针,因此,函数名和其他包含对象指针的变量没什么区别。换句话来说,就是一个函数可能会有多个名字而已。 如一下代码: function sum(n1,n2){ return n2+n1; } var other=sum; other(10,10);//输出20 sum= null other(10,10); //输出20

以上代码说明,首先定义一个sum的函数,最后又声明一个other函数,并设置和sum相等,这里指的注意的是,不带括号的函数名是访问函数指针,而非调用函数。此时,other和sum都指向同一个函数,因此,other也可以代用和返回结果,即便吧sum设置为null,让它失去指向函数的指针,other仍然可以正常使用。

JS中没有重载(需要深入理解) 可以把函数名理解为指针,有助于理解为什么JS中没有函数重载的概念。 如果同时声明两个同名的函数体A B,可以理解为最后指针名的是指向函数体B,但函数体A存在在执行环境中,只是没有指针指向这个函数体而已。

JS中没有重载概念,不限定参数类型和参数个数,如果想重载函数怎么办? 可以用argument.length()方法判断函数参数个数,从而实现适当的功能。 例如: function doAdd(){ if(arguments.length == 1 ){ alert(arguments[0]); }else if(arguments.length == 2 ){ alert(arguments[1]); } }

函数声明与函数表达式的执行顺序 在JS的解释器中,解析器会率先读取函数的声明,并使其在执行任何代码之前可以用函数;至于函数表达式,则必须的等到解析器执行到他所在的代码行,才会真正被解析执行。 看一下例子: alert(sum(1,2)); function sum(n1,n2){ return n1+n2; } 以上例子完全可以正常执行,因为在函数声明优先执行。

如果是函数表达式,则返回未定义; alert(a); //undefined var a=1;

如果换一种定义函数的方式,利用变量表达式方式声明函数 也是不行的。 alert(sum(1,2)); var sum = function (n1,n2){ return n1+n2; }; //报错VM21564:2 Uncaught TyPEError: sum is not a function(…)

有此例子能得到一个另外的结论,用等价的函数表达式声明函数的时候,这个函数体不会优先被执行,而是跟随此函数表达式的执行顺序执行。

作为值的函数 在JS的中,函数名本身就是变量,所以函数也可以当做值来使用,也就是说,JS中不仅可以像传递参数一样把函数传递给另外一个函数,而且可以将一盒函数作为另外一个函数的结果返回。

如一下例子: function callSomeFunction(someFunction,someArgument){ return someFunction(someArgument); } function add10(num){ return num+10; } var result1=callSomeFunction(add10,10); alert(result1); //20

function getGreeting(name){ return "hello , "+name; } var result2=callSomeFunction(getGreeting,"liguanlin"); alert(result2); //hello,liguanlin

这里的callSomeFunction函数为通用,第一个参数指定是传递函数进来,无论传递进来的是什么参数,返回执行的都是第一个参数后的结果。如果要访问函数的指针而不执行函数的话,必须去掉函数名后的圆括号。上例子中,someFunction这个参数的作用是,用于接收函数的参数。

从一个函数中返回另一个函数,而且这也是一个非常有用的技。例如,有一个对象数组,我们想根据某个对象属性对数组进行排序,而传递给sort()方法的比较函数,要接收两个参数,即要比较的值。所以,我们可以定义一个函数,接收一个函数名,然后更具这个属性名来创建一个比较函数。 function createComparisonFunction (PRopertyName){ return function (o1,o2){ var v1=o1[propertyName]; var v2=o2[propertyName]; if (v1 < v2) { return -1; }else if( v1 > v2 ){ return 1; }else{ return 0; } } } 这函数定义有点复杂,实际上无非就是一个函数里面嵌套另外一个函数,然后把嵌套的那个函数用return返回出去。在内部函数收到propertyName参数后,他会使用方括号表示法来取得给定的属性值。取得了想要的属性值之后,定义比较函数就非常简单了。

var data=[{name:"Zachary",age:28},{name:"Nicholas",age:29}];

data.sort(createComparisonFunction(&#39;name')); alert(data[0].name);

data.sort(createComparisonFunction('age')); alert(data[0].name);

这里,我们创建了一个包含两个对象的数组data。

函数内部属性 在函数内部,有两个特殊的对象,就是arguments和this。 arguments调用自身 arguments 返回的表示正在执行和调用它的函数的参数。 caller 返回一个函数的引用,该函数调用了当前函数。 callee 返回的是正在被执行的function对象。一般用法为argument.callee(); arguments.length是实参度,arguments.callee.length是形参长度,由此能够判断调用时形参长度是否和实参长度一致。

这里有个不错的帖子,可以学习参考一下https://blog.csdn.net/oscar999/article/details/8511335

另外一个特殊的对象就是this,这个this和其他语言的this大致类似,换句话说,this引用的是函数据以执行环境的对象,或者也可以说是this值(当网页的全局作用域中调用函数时,this对象引用的就是window。)

window.color="red"; var o = {color : "blue"}; function sayColor(){ alert(this.color); } sayColor(); o.sayColor=sayColor; o.sayColor();

上面这个例子sayColor()是在全局作用域中定义的,它引用this对象,由于在调用函数之前this的值并不确定,因此this可能会在代码执行过程中引用不同的对象。当在全局作用域中调用sayColor()时,this引用的是全局对象window;换句话说,对this.color求值会转换成对window.color求值,于是结果就返回“red”,而当把这个函数赋给对象o,并调用O.sayColor()时,this引用的对象o,因此对this.color求值会转换成对o.color求值,结果就返回"blue"。

函数属性和方法 函数就是对象,所以函数也有属性和方法,每个函数都包含两个属性:length和prototye。 直接调用length属性,返回的是这个函数的参数的个数。 例如: function func(n1,n2){ return n1+n2; } func.length//2

每个函数都包含两个非继承而来的方法: apply()和call(),这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内的this对象的值。首先,apply()方法接收两个参数:一个是在其中运行函数的作用域,另外一个是参数数组。其中两个参数可以是array的实力,也可以是argument对象。

function add(n1,n2){ return n1+n2; } function callAdd1(n1,n2){ return add.apply(this,arguments); } function callAdd2(n1,n2){ return add.apply(this,[n1,n2]); } callAdd1(5,5); //输出结果10 callAdd2(5,5); //输出结果 10

在这个例子中,callAdd1()在执行sum()函数时传入this作为this的值(因为是在全局作用域中调用的,所以传入的就是window对象)和argument对象。而call()方法与apply()方法的作用相同,他们的区别仅仅在于接收参数的方式不同,对于call()方法而言,第一个参数是this值没有变化,变化的是其余的参数都是直接传递给函数的,换句话说,就是在使用call()方法时,传递给函数的参数必须逐个列举出来。

function add(n1,n2){ return n1+n2; } function callAdd(n1,n2){ return add.call(this,n1,n2); } callAdd(5,5);//输出结果 10

其实,传递参数并不是apply()和call()的真正用武之地,他们真正强大的地方是能够扩充函数赖以运行的作用域。 window.name="win"; //"win" var obj={name:"objName"}; function func(){ console.LOG(this.name); } func(); //win func.call(this); //win func.call(window); //win func.call(obj); //objName

使用call()或apply()来扩充作用域的最大好处就是,对象不需要与方法有任何耦合关系。

绑定对象的作用域Bind() ecmascript 还定义了一个方法:bind()。这个方法会创建一个函数的实例,其this的值会被绑定到传给bind()函数的值。 这个方法仅限IE9+浏览器支持。

觉得可用,就经常来吧! 脚本宝典 欢迎评论哦! js脚本,巧夺天工,精雕玉琢。小宝典献丑了!

脚本宝典总结

以上是脚本宝典为你收集整理的javascript代码实例教程-javascript引用类型――Function类型(特性)解析全部内容,希望文章能够帮你解决javascript代码实例教程-javascript引用类型――Function类型(特性)解析所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。