Function 对象(重点)
函数的定义:
''' function 函数名 (参数) { 函数体; return 返回值; } '''
功能说明:
- 可以使用变量、常量或表达式作为函数调用的参数
- 函数由关键字function定义
- 函数名的定义规则与标识符一致,大小写是敏感的
- 返回值必须使用return
Function 类可以表示开发者定义的任何函数。
用 Function 类直接创建函数的语法如下:
''' function 函数名 (参数) {
函数体;
return 返回值;
}
//another way:
var 函数名 = new Function("参数1","参数n","function_body"); '''
虽然由于字符串的关系,第二种形式写起来有些困难,但有助于理解函数只不过是一种引用类型,它们的行为与用 Function 类明确创建的函数行为是相同的。
实例:
''' alert(1); function func1(){ alert('hello yuan!'); return 8 }; ret=func1(); alert(ret); ---------------- var func1=new Function("name","alert("hello"+name);"); func1("yuan") '''
注意:js的函数加载执行与python不同,它是整体加载完才会执行,所以执行函数放在函数声明上面或下面都可以:
<script> //f(); --->OK function f(){ console.log("hello") } f() //----->OK </script>
Function 对象的 length 属性
如前所述,函数属于引用类型,所以它们也有属性和方法。
比如,ECMAScript 定义的属性 length 声明了函数期望的参数个数。
alert(func1.length)
Function 对象的方法
Function 对象也有与所有对象共享的 valueOf() 方法和 toString() 方法。这两个方法返回的都是函数的源代码,在调试时尤其有用。
函数的调用
function func1(a,b){ alert(a+b); } func1(1,2); //3 func1(1,2,3);//3 func1(1); //NaN func1(); //NaN //只要函数名写对即可,参数怎么填都不报错. -------------------面试题----------- function a(a,b){ alert(a+b); } var a=1; var b=2; a(a,b)
函数的内置对象arguments
function add(a,b){ console.log(a+b);//3 console.log(arguments.length);//2 console.log(arguments);//[1,2] } add(1,2) ------------------arguments的用处1 ------------------ function nxAdd(){ var result=0; for (var num in arguments){ result+=arguments[num] } alert(result) } nxAdd(1,2,3,4,5) // ------------------arguments的用处2 ------------------ function f(a,b,c){ if (arguments.length!=3){ throw new Error("function f called with "+arguments.length+" arguments,but it just need 3 arguments") } else { alert("success!") } } f(1,2,3,4,5)
匿名函数
// 匿名函数 var func = function(arg){ return "tony"; } // 匿名函数的应用 (function(){ alert("tony"); } )() (function(arg){ console.log(arg); })('123')
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>标题</title> </head> <body> <script> // 函数第一种创建方式 function f(x,y) { console.log(x+y); // return是函数返回值,无return时返回undefined }; f(1,1); // 2 // 函数第二种创建方式 var obj=new Function('x', 'y', 'console.log(x+y)'); // 虽然由于字符串的关系,第二种形式写起来有些困难,但有助于理解函数只不过是一种引用类型,它们的行为与用 Function 类明确创建的函数行为是相同的 obj(2,2); // 4 // 注意:js的函数加载执行与python不同,执行代码之前,把所有function先加载完,所以执行函数放在函数上面或下面都可以 foo('alex'); function foo(name) { console.log('hello '+name); }; foo('mike'); // Function对象的length属性 console.log(f.length); // 2,代表函数需要几个参数 // Function对象的方法valueOf()/toString(),这两个方法返回的都是函数的源代码 console.log(add.valueOf()); // ƒ add(x,y,z) {return x+y+z;} console.log(add.toString()); // function add(x,y,z) {return x+y+z;} // 函数调用(参数多与少的问题) function add(x,y,z) { return x+y+z; }; console.log(add(1,2,3,4,5,6)); // 6,传入的参数多于函数规定参数个数时,只取前面对应需要的参数 console.log(add(1,2)); // NaN,传入参数少于函数规定参数个数时,缺少的参数默认为undefined;因为undefined无法转为数字,数字与字符串相加结果为NaN console.log(add('1','2')); // '12undefined',可以证明最后一个缺少的参数值为undefined //***********面试题*********** // function func(x,y) { // return x+y; // }; // var func=1; // var b=2; // func(func,b); // Uncaught TypeError: func is not a function,和python一样,func又指向了数字1覆盖了之前的指向 // 函数的内置对象arguments,无论函数传入多少参数都能被封装到arguments中 function f1() { console.log(arguments); // Arguments(5) [1, "2", 3, "hello", Array(2), callee: ƒ, Symbol(Symbol.iterator): ƒ] for (var n in arguments) { console.log(arguments[n]); }; }; f1(1,'2',3,'hello',[4,'5']); // 1;'2';3;'hello';[4,'5'] // 第一种匿名函数写法 var f2=function(arg) { alert(arg); }; f2('hello'); // 与正常函数区别在哪里?正常函数调用可以写在函数前面,而此种方法不可以 /* f3('no_function'); var f3=function(arg) { alert(arg); }; */ // 打开控制台发现报错信息,Uncaught TypeError: f3 is not a function // 第二种匿名函数写法(自执行函数) (function(args) { console.log(args); })('javascript'); // 'javascript' </script> </body> </html>