十年专注于品牌网站建设 十余年专注于网站建设_小程序开发_APP开发,低调、敢创新、有情怀!
南昌百恒网络微信公众号 扫一扫关注
小程序
tel-icon全国服务热线:400-680-9298,0791-88117053
扫一扫关注百恒网络微信公众号
扫一扫打开百恒网络微信小程序

百恒网络

南昌百恒网络

ECMAScript 函数属性和方法结合实例进行介绍

百恒网络 2012-09-06 4270

前面曾经提到过,ECMAScript中的函数是对象,因此函数也有属性和方法。每个函数都包含两个属性;length和prototype。其中,length属性表示函数希望接收的命名参数的个数,如下面的例子所示:

function sayName (name){

alert(name);

function sum (numl,num2){

return numl+num2;

function sayHi(){

alert("hi");

alert(sayName.length); //1

alert(sum.length)j //2

alert(sayHi.length); //0

}

以上代码定义了3个函数,但每个函数接收的命召参数个数不同。南昌网络公司技术人员要讲的是,首先,sayName()函数定义了一个参数,因此其length属性的值为1。类似地,sum()函数定义了两个参数,结果其length属性中保存的值为2。而sayHi()没有命名参数,所以其length值为0。

在ECMAScript核心所定义的全部yp性中,逞霍黔嘉紧的就要数prototype属性了。对于ECMAScript中的引用类型而言,prototype是保存琴帮咿琵疆霹霸哥薪j譬换句话说,诸如toString()和valueOf()等方法实际上都保存在prot。type名下,只不过是通过各自对象的实例访问罢了。在创建自定义引用类型以及实现继承时,prototype属性的作用是极为重要的

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

function sum (numl, num2){

return numl+num2:

}

function callSuml (numl, num2){

return sum.apply( this,arguments); //传入arguments对象

}

function callSum2 (numl, num2){

return sum.apply( this,[numl,num2]); //传入数组

}

alert (callSuml(10,10))j //20

alert( callSum2 (10, 10)); //20

在上面这个例子中,callSuml()在执行sum()函数时传人了this作为作用域(因为是在全局作用域中调用的,所以传人的就是window对象)和arguments对象。而callSLun2同样也调用了sum()函数,但它传人的则是this和一个参数数组。这两个函数都会正常执行并返回正确的结果。

call()方法与apply()方法的作用相同,它们的区别仅在于接收参数的方式不同。对于call()方法而言,第一个参数是作用域没有变化,变化的只是其余的参数都是直接传递给函数的。换句话说,在使用call()方法时,传递给函数的参数必须逐个列举出来,如下面的例子所示:

function sum (numl, num2){

return numl+num2;

}

function callSum (numl, num2){

return sum.call(this, numl, num2);

}

alert(callSum(10,10)); //20

在使用call()方法的情况下,callSum()必须明确地传人每一个参数。结果与使用apply()没有什么不同。至于是使用apply()还是call(),完全取决于你采取哪种给函数传递参数的方式最方便。如果你打算直接传人argrnnents对象,或者包含函数中先接收到的也是一个数组,那么使用apply()肯定更方便;否则,选择call()可能更合适。(在不给函数传递参数的情况下,使用哪个方法都无所谓。)事实上,传递参数并非apply()和call()真正的用武之地;它们真正强大的地方是能够扩充函数赖以运行的作用域。下面来看一个例子:

window.color="red":

var o=(color:"blue");

function sayColor(){

alert(this.color);}

sayColor(); //red

sayColor.call(this); //red

sayColor.call(window); //red

sayColor.call(o); //blue

这个例子是在前面说明this对象的示例基础上修改而成的。这一次,sayColor()也是作为全局函数定义的,而且当在全局作用域中调用它时,它确实会显示”red”——因为对this.color的求值会转换成对window.color的求值。而sayColor.call (this)和sayColor.call (window),则是两种显式地在全局作用域中调用函数的方式,结果当然都会显示"red"。但是,当运行sayColor.call (o) 时,函数的执行环境就不一样了,因为此时函数体内的this对象指向了o,于是结果显示的是"blue"。

使用call()(或apply())来扩充作用域的最大好处,就是对象不需要与方法有住何耦合关系。在前面例子的第一个版本中,我们是先将sayColor()函数放到了对象o中,然后再通过。来调用它的;而在这里重写的例子中,就不需要先前那个多余的步骤了。

每个函数继承的toLocaleString()和toString()方法始终都返回函数的代码。返回代码的格式则因浏览器而异——有的返回的代码与源代码中的函数代码一样,而有的则返回函数代码的内部表示,即由解析器删除了注释并对某些代码作了改动后的代码。由于存在这些差异,我们无法根据这两个方法返回的结果来实现任何重要功能;不过,这些信息在调试代码时倒是很有用。另外一个继承的valueOf()方法同样也只返回函数代码。

每个函数都有一个非标准的caller属性,该属性指向调用当前函数的函数。一般是在一个函数的内部,通过arguments.callee.caller来实现对调用栈的追溯。目前,IE、Firefox、Safari和Chrome都支持caller属性,但我们只建议将该属性用于调试目的。

南昌网站建设公司工程师提示,读者一定要牢记函数的名字仅仅是一个包含指针的变量而已,因此,即是在不同的环境中执行,全局的sayColor()函数与o.sayColor()指向的仍然是同一个函数。

希望对广大站长或网站建设公司或从事企业网站建设的团队有所帮助,如对此不太理解的,可以与南昌网站设计公司百恒网络技术部联系。我们很高与广大站长和网站建设公司技术人员分享我们的技术和经验。


400-680-9298,0791-88117053
扫一扫关注百恒网络微信公众号
扫一扫打开百恒网络小程序

欢迎您的光顾,我们将竭诚为您服务×

售前咨询 售前咨询
 
售前咨询 售前咨询
 
售前咨询 售前咨询
 
售前咨询 售前咨询
 
售前咨询 售前咨询
 
售后服务 售后服务
 
售后服务 售后服务
 
备案专线 备案专线
 
×