《JavaScript高级程序设计》 | 您所在的位置:网站首页 › jquery第十章 › 《JavaScript高级程序设计》 |
第十章:函数
实际上函数也是对象,每个函数都是对象Function的实例,其也拥有属性和方法; 因为函数也是对象,所以函数名则是指向函数对象的指针; 10.1 函数的声明函数声明式 function sum(num1,num2){ return num1+num2; }函数表达式 let sum = function(num1,num2){ return num1+num2; }构造函数式: let sum = new Function('num1','num2','return num1+num2');十分不推荐这种写法,因为会解释两次,影响性能。 箭头函数式: let sum = (num1,num2) => return num1+num2;箭头函数有如下特点: 如果只有一个参数,可以省略小括号 如果只有一行代码,可以省略大括号 不能使用arguments``super和new.target;也不能使用构造函数、没有prototype属性 this指向定义箭头函数时的上下文作用域 10.2 函数名因为函数名就是指向函数的指针,所以可以一个函数拥有多个名称; function sum(num1,num2){ return num1+num2; } let anotherSum = sum; console.log(sum(10,20)); // 30 console.log(anotherSum(10,20)); // 30在ES6中,所有函数对象都会暴露一个只读的name属性; function foo() {} let bar = function() {}; let baz = () => {}; let nav = new Function(); console.log(foo.name); // foo console.log(bar.name); // bar console.log(baz.name); // baz console.log((() => {}).name); //(空字符串) console.log(nav.name); // anonymous 10.3 函数参数与其他语言不一样,ECMAScript函数不关心传入参数的个数;不管少传,还是多传,解释器都不会报错。 主要是因为:参数在内部表现为一个数组;箭头函数除外,可以在函数内部访问arguments对象,从而获取传参、传参个数。 function sayHi(name,message){ console.log(`Hi,${name}!${message}`); } function anotherSayHi(){ console.log(`Hi,${arguments[0]}!${arguments[1]}`); } sayHi('zyzc','welcome'); // Hi,zyzc!welcome anotherSayHi('zyzc','welcome'); // Hi,zyzc!welcome与其他语言不同,ECMASCript函数的参数只是方便调用而命名的,而不是必需的;因为根本不存在验证命名参数的机制 function getLength(){ console.log(arguments.length); } getLength(); // 0 getLength('zyzc',18); // 2这里有一个需要注意的地方,arguments对象的值,始终与对应的命名参数同步。 function sum(num1,num2){ arguments[0] = 10; console.log(num1 + num2); } sum(20,20); // 30但是在严格模式下不会出现这种情况。再者:函数中尝试修改arguments对象会导致语法错误。 "use strict" function sum(num1,num2){ arguments = {}; // Unexpected eval or arguments in strict mode console.log(num1 + num2); } 10.3.1 箭头函数参数传给箭头函数的参数,不能使用arguments关键字访问; function foo(){ console.log(arguments[0]); } let bat = ()=>{ console.log(arguments[0]); } foo(5); // 5 bat(5); // {}但是可以这样做& |
CopyRight 2018-2019 实验室设备网 版权所有 |