- 1、本文档共43页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
JavaScript F的unction 函数深入总结
整理了JavaScript中函数Function的各种,感觉函数就是一大对象啊,各种知识点都能牵扯进来,不单单是?Function?这个本身原生的引用类型的各种用法,还包含执行环境,作用域,闭包,上下文,私有变量等知识点的深入理解。函数中的return?return?语句可以不带有任何返回值,在这种情况下(?return;?或函数中不含?return?语句时),函数在停止执行后将返回?undefiend?值。这种用法一般在需要提前停止函数执行而又不需要返回值的情况下。?return?false?可以阻止元素的默认事件。?return?返回的是其所在函数的返回值functionn(){ (function(){return5; })();}n();// undefined//立即执行匿名函数中的return语句其实是返回给它所在的匿名函数的。functionn(){var num= (function(){return5; })();console.log(num);}Function类型函数实际上是对象,每个函数实际上都是?Function?类型的实例。而且与其他引用类型一样具有属性和方法。函数名实际上是一个指向内存堆中某个函数对象的指针。定义函数的方式函数声明functionsum(num1,num2){return num1+num2;}函数表达式var sum=function(num1,num2){return num1+num2;};定义了一个变量?sum?并将其初始化为一个函数,注意到?function?关键字后面并没有函数名,这是因为在使用函数表达式定义函数,没必要使用函数名,通过变量?sum?即可引用函数。还要注意函数末尾有个分号,就像声明其他变量一样。?new?构造函数,虽然这种用法也是函数表达式,但该用法不推荐。因为这种语法会导致解析两次代码(第一次是解析常规的ECMAScript代码,第二次是解析传入构造函数中的字符串),影响性能。使用?Function?构造函数,构造函数可以接受任意数量的参数,但最后一个参数始终都被看成是函数体,前面的参数则枚举出了新函数的参数。var sum=newFunction(num1,num2,return num1+num2;);sum;// functionanonymous(num1,num2/**/) {return num1+num2;}当使用不带圆括号的函数名是访问函数指针,而非调用函数。理解参数ECMAScript中所有参数传递的都是值(即使是引用也是传递的地址值,不是引用传递参数(可参考JavaScript传递参数是按值传递还是按引用传递))。ECMAScript函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型。之所以这样,是因为ECMAScript中的参数在内部是用一个数组表示的。函数接收到的始终都是这个数组,而不关心数组中包含哪些参数。在函数体内,可以通过?arguments?对象来访问这个数组。从而获取传递给函数的每个参数。function func(){ console.log(Ototype.toString.call(arguments));}func();// [object Arguments]关于?arguments?的行为,它的值永远与对应命名参数的值保持同步。因为?arguments?对象中的值会自动反映到对应的命名参数。所以修改?arguments[1]?,也就修改了?num2?。不过这并不是说读取这两个值会访问相同的内存空间,它们的内存空间是独立的,但他们值会同步(WHY??),要是JavaScript能直接访问内存就好了验证一下。但如果只传入了一个参数,那么?arguments[1]?设置的值不会反映到命名参数中,这是因为?arguments?对象的长度是由传入参数个数决定的,不是由定义函数时的命名参数个数决定的,没有传递值的命名参数将自动被赋予?undefiend?值,这就跟定义了变量但没初始化一样。functiondoAdd(num1,num2){console.log(arguments.length);console.log(num2)arguments[1]=10;console.log(num2);}doAdd(5,0);//2 0 10doAdd(5);//1 undefiend undefined没有重载ECMAScript函数不能像传统意义上那样实现重载,而在其他语言中(Java),可以为一个函数编写两个定义,只要这两个定义的签名(接收参数的类型和数量)不同即可。不能实现重载的原因:ECMAScript函数没有签名,因为其参数是由包含零个或多个值的数组来表示的。没有函数签名,真正的重载是不可能
文档评论(0)