初步学习:
1 函数参数允许尾逗号 function clownsEverywhere( param1, param2, //param2后面有逗号 ) { } 2 函数参数可以赋初值 利用解构赋值默认值结合使用 函数的 length 属性 失真 ,是指没有赋初值的函数参数个数 3 name 属性 函数的name属性返回该函数名 4 箭头函数,我理解=> 后面就是返回值,如果有多个参数,就用()括起来; 如:var add=(val1,val2)=>val1+val2; (1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。 this对象的指向是可变的,但是在箭头函数中,它是固定的。 function foo() { setTimeout(() => { console.log(‘id:‘, this.id); }, 100); } var id = 21; foo.call({ id: 42 }); // id: 42 上面代码中,setTimeout的参数是一个箭头函数,这个箭头函数的定义生效是在foo函数生成时,而它的真正执行要等到 100 毫秒后。 如果是普通函数,执行时this应该指向全局对象window,这时应该输出21。但是,箭头函数导致this总是指向函数定义生效时所在的对象 (本例是{id: 42}),所以输出的是42。 5 rest参数,形如:...params 例子:function doadd(...params){ console.info(params.length); console.info(params[0]); console.info(params[1]) } doadd(99,33.34,1,2,3,4,5,) 7 99 33.34 注意,rest 参数之后不能再有其他参数(即只能是最后一个参数),否则会报错 函数的length属性,不包括 rest 参数。 arguments对象不是数组,而是一个类似数组的对象。所以为了使用数组的方法,必须使用Array.prototype.slice.call先将其转为数组。 rest 参数就不存在这个问题,它就是一个真正的数组,数组特有的方法都可以使用。 下面是一个 rest 参数代替arguments变量的例子。 // arguments变量的写法 function sortNumbers() { return Array.prototype.slice.call(arguments).sort(); } // rest参数的写法 const sortNumbers = (...numbers) => numbers.sort(); 6 双冒号运算符 函数绑定运算符是并排的两个冒号(::),双冒号左边是一个对象,右边是一个函数。该运算符会自动将左边的对象,作为上下文环境(即this对象),绑定到右边的函数上面。 foo::bar; // 等同于 bar.bind(foo); foo::bar(...arguments); // 等同于 bar.apply(foo, arguments); const hasOwnProperty = Object.prototype.hasOwnProperty; function hasOwn(obj, key) { return obj::hasOwnProperty(key); } 7 严格模式 只要参数使用了默认值、解构赋值、或者扩展运算符,函数内就不能显式指定严格模式。因为:矛盾点 参数先执行,执行到函数体发现要严格,参数处才报错。 两种解决办法: 1 设定全局性的严格模式,这是合法的。 2 把函数包在一个无参数的立即执行函数里面
结束