- 1、本文档共43页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
JavaScriptFunction函数深入总结选编
整理了JavaScript中函数Function的各种,感觉函数就是一大对象啊,各种知识点都能牵扯进来,不单单是?Function?这个本身原生的引用类型的各种用法,还包含执行环境,作用域, HYPERLINK /article/javascript-bibao.html \o 闭包 \t _blank 闭包,上下文,私有变量等知识点的深入理解。
函数中的return
?return?语句可以不带有任何返回值,在这种情况下(?return;?或函数中不含?return?语句时),函数在停止执行后将返回?undefiend?值。这种用法一般在需要提前停止函数执行而又不需要返回值的情况下。
?return?false?可以阻止元素的默认事件。
?return?返回的是其所在函数的返回值
function n(){
(function(){
return 5;
})();
}
n();// undefined
//立即执行匿名函数中的return语句其实是返回给它所在的匿名函数的。
function n(){
var num= (function(){
return 5;
})();
console.log(num);
}
Function类型
函数实际上是对象,每个函数实际上都是?Function?类型的实例。而且与其他引用类型一样具有属性和方法。函数名实际上是一个指向内存堆中某个函数对象的指针。
定义函数的方式
函数声明
function sum(num1,num2){
return num1+num2;
}
函数表达式
var sum=function(num1,num2){
return num1+num2;
};
定义了一个变量?sum?并将其初始化为一个函数,注意到?function?关键字后面并没有函数名,这是因为在使用函数表达式定义函数,没必要使用函数名,通过变量?sum?即可引用函数。还要注意函数末尾有个分号,就像声明其他变量一样。
?new?构造函数,虽然这种用法也是函数表达式,但该用法不推荐。因为这种语法会导致解析两次代码(第一次是解析常规的ECMAScript代码,第二次是解析传入构造函数中的字符串),影响性能。使用?Function?构造函数,构造函数可以接受任意数量的参数,但最后一个参数始终都被看成是函数体,前面的参数则枚举出了新函数的参数。
var sum=new Function(num1,num2,return num1+num2;);
sum;//
function anonymous(num1,num2
/**/) {
return num1+num2;
}
当使用不带圆括号的函数名是访问函数指针,而非调用函数。
理解参数
ECMAScript中所有参数传递的都是值(即使是引用也是传递的地址值,不是引用传递参数(可参考 HYPERLINK /question\t _blank 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?值,这就跟定义了变量但没初始化一样。
function doAdd(num1,num2){
console.log(arguments.length);
console.log(num2)
arguments[1]=10;
console.log(num2);
}
doAdd(5,0);//
文档评论(0)