[关闭]
@Dreamingboy 2017-09-17T13:12:00.000000Z 字数 4600 阅读 864

2. 函数

ES6


2.1 默认参数

1、ECMAScript模拟默认参数的写法

  1. function try1(num1,num2,num3){
  2. num1 = (typeof num1 !== "undefined")? num1:value1;//如果num1不是undefined,也就是传入了参数,那么num1的值为传入的值,如果是undefined,那么num1的值是value1(默认值)
  3. }

2、ECMAScript6中的默认参数的写法

  1. function try1(num1=value1,num2=value2,num3=value3){
  2. dosomething;
  3. }

也就是先初始化参数,掉用函数的时候,在没有传入参数的情况下,直接使用默认的值,而在为参数传入值的情况下就会使用传入的值。
而且传入的参数是按照顺序来匹配的,并且没有数据类型的限制,也就是说,在创建函数的时候默认参数设置成字符串,但是实际上调用函数的时候传入的参数的数据类型可以是别的,比如数字

  1. function try1(num1="string",num2=200,num3=function(){}){
  2. console.log(num1);
  3. console.log(num2);
  4. console.log(num3);
  5. }
  6. try1(123,"abc",[]);
  7. //123; abc;[]

3、默认参数对arguments的影响
设置默认参数后arguments.length的值是实际上传入的参数的数量

  1. function try1(num1="string",num2=200,num3=function(){}){
  2. console.log(arguments.length);//1
  3. console.log(arguments);//[123, callee: (...), Symbol(Symbol.iterator): ƒ]
  4. console.log(num1);//123
  5. console.log(num2);//abc
  6. console.log(num3);//ƒ (){}
  7. }
  8. try1(123);

4、默认参数表达式
默认参数可以是函数,通过函数调用可以实现更丰富的变化,而且可以引用函数可以引用默认参数,但是在引用默认参数的时候,只允许引用前面的参数,不能引用后面的参数

  1. function getValue(num){
  2. return num;
  3. }
  4. function try1(num1="string",num2= getValue(num1)){
  5. console.log(num1);
  6. console.log(num1 + num2);
  7. }
  8. try1(123);//246

5、不定参数
语法:

  1. fcuntion functionName(num1,...keys){}

在命名参数前面加上“...”,可以将命名参数变成一个数组,但是命名不定参数有两个限制:

  1. var object = {
  2. name:"mike",
  3. age:1
  4. }
  5. function pick(num1,...keys){
  6. var result = new Object();
  7. for (var i = 0; i < keys.length; i++) {
  8. result[keys[i]] = num1[keys[i]];
  9. }
  10. console.log(result);
  11. }
  12. pick(object,"name","age");//{name: "mike", age: 1}

2.2 Function构造函数

2.3 展开运算符

展开运算符可以实现将一个数组拆散成各自独立的参数并且传入函数
使用方法:将数组传入函数中并且在数组前面加上“...”

  1. function getMax(num){
  2. console.log(Math.max(...num));
  3. }
  4. getMax([1,2,3,4,5]);//5
  5. ES5实现:
  6. function getMax(num){
  7. console.log(Math.max.apply(Math,num));
  8. }
  9. getMax([1,2,3,4,5]);

作用域

在设置了函数的默认参数后,函数进行声明初始化之后参数就会形成一个单独的作用域。初始化结束之后这个作用域就会消失。

  1. var x = 1;
  2. function fun(x,y=x){
  3. console.log(y);
  4. }
  5. fun(2);//2
  6. 调用函数的时候参数xy形成一个作用域,而对x进行初始化之后x的值是2,之后再对y进行赋值
  7. var x = 1;
  8. function fun(x,y=x){
  9. console.log(y);
  10. }
  11. fun();//undefined
  12. 调用fun的时候经历下面的过程:
  13. let x = undefined;
  14. y=x=undefined;
  15. console.log(y);
  16. 这是因为let声明的函数会被先放在临时死区里面,而var初始化的函数是被提升到全局,而参数只能调用临时死区的参数
  17. function f(y = x) {
  18. let x = 2;
  19. console.log(y);
  20. }
  21. f() // ReferenceError: x is not defined
  22. 函数内部的参数无法影响到默认参数形成的作用域,所以报错

2.4 name属性

在ES6中每个函数都有自己的名字,而函数名的确定规则:

  1. function fun1(){
  2. console.log(fun1.name);
  3. }
  4. fun1();//fun1
  5. var fun2 = function(){
  6. console.log(fun2.name);
  7. }
  8. fun2();//fun2
  9. var fun3 = function fun(){
  10. console.log(fun3.name);
  11. }
  12. fun3();//fun

函数的多种用途

JavaScript中函数可以通过直接调用来执行函数,也可以通过new来创建一个对象。
函数内部的两个方法:

  1. function fun1(name){
  2. this.name = name;
  3. return this.name;
  4. }
  5. var a = new fun1("mike");
  6. var b = fun1("bob");
  7. console.log(a);//fun1 {name: "mike"}
  8. console.log(b);//bob

元属性new.target

用于判断函数是否是使用new关键字来调用。当调用[[Construct]]方法的时候,new.target被复制为操作符的目标,通常是新创建的对象实例,而如果调用[[Call]]方法则new.target的值为undefined。

块级函数

ES5中在严格模式下在代码块中声明函数是一种错误,但是在ES6中可以再代码块中声明函数,在严格模式下,声明的函数只能在代码块中被访问,而在非严格模式下,代码块中声明的函数会被提升到全局作用域,此外,使用let创建的函数不会被提升,其他情况下会被提升到代码块的顶部或者是作用域的顶部

  1. function fun1(number){
  2. "use strict";
  3. console.log(typeof try1);//undefined
  4. if (number>10) {
  5. console.log(typeof try1);//function
  6. function try1(){
  7. console.log(number);
  8. }
  9. try1();
  10. }
  11. }
  12. fun1(11);
  13. ///////
  14. function fun1(number){
  15. if (number>10) {
  16. console.log(typeof try1);
  17. function try1(){
  18. console.log(number);
  19. }
  20. try1();
  21. }
  22. console.log(typeof try1);//function
  23. }
  24. fun1(11);

箭头函数

箭头函数的特点:

1、箭头函数的写法

  1. let sum1 = value=>value;
  2. console.log(sum1(1));
  3. ////////
  4. 等同于:
  5. var sum1= function(value){
  6. return value;
  7. };
  8. console.log(sum1(1));
  1. let sum2 = (num1,num2)=> num1+num2;
  2. let sun3 = ()=> "mike";
  1. let sum4 = (num1,num2)=>{return num1+num2; return num1*num2};
  1. 直接返回对象字面量
  2. let sum5 = (age,name)=>({age:age,name:name});
  3. 非直接返回对象字面量:
  4. let sum5 = (age,name) =>{
  5. console.log( "teacher");
  6. return {age:age, name:name};
  7. };
  1. let sum5 = ((age,name) =>{
  2. console.log( "teacher");
  3. return {age:age, name:name};
  4. })(10,"mike");

没有this绑定

箭头函数必须通过查找作用域链来决定this值,如果箭头函数被非箭头函数包含,则this绑定的是最后一层非箭头函数的this,否则,this的值会被设置成undefined。

  1. let pageHandler = {
  2. id: "1234",
  3. init: function() {
  4. document.addEventListener("click", event => this.doSomething(event.type))//此处this是pageHandler这个对象
  5. },
  6. doSomething: function(type) {
  7. console.log("Handle" + type + this.id);
  8. }
  9. };
  10. pageHandler.init();

箭头函数不是构造函数,因此不能使用new操作符来创建新的函数

箭头函数和数组

箭头函数的语法简介性适合于数组方法合用

  1. let result = array.sort((a,b)=>return a-b)

箭头函数没有用arguments绑定

箭头函数本身不具备arguments属性,但是其可以方位外层的函数的arguments对象

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注