Skip to content

Files

Latest commit

Sep 18, 2018
61c0e9e · Sep 18, 2018

History

History
121 lines (94 loc) · 3.57 KB

function.md

File metadata and controls

121 lines (94 loc) · 3.57 KB

阅读understanding es6所学

函数相关部分

function params

传参数undefined是使用默认参数, null是进行传参,参数就是null. 换而言之,想要使用默认的参数只能method()或者method(undefined).

  • 函数默认参数的TDZ

我们知道块级作用域会有TDZ. 其实方法参数也存在TDZ.

function add(first = second, second) {
    return first + second;
}

console.log(add(1, 1));         // 2
console.log(add(undefined, 1)); // throws error

上面这段代码在调用时初始化默认函数的时候,其实时做了下面的事情.

// JavaScript representation of call to add(1, 1)
let first = 1;
let second = 1;

// JavaScript representation of call to add(undefined, 1)
let first = second;
let second = 1;

所以会报错。因为触发了TDZ的规则。

⚠️函数的参数体有自己的作用域和TDZ,他和函数内容时分开的。这就意味着参数体内的默认值不能访问函数体内的任何变量。

  • Rest Parameters
    • rest params must be last
    // Syntax error: Can't have a named parameter after rest parameters
      function pick(object, ...keys, last) {
          let result = Object.create(null);
    
          for (let i = 0, len = keys.length; i < len; i++) {
              result[keys[i]] = object[keys[i]];
          }
    
          return result;
      }

 可以发现,如果不是放在最后一个,会有一个语法的错误.

  • can not use for single argument
 let object = {
    // Syntax error: Can't use rest param in setter
  set name(...value) {
      // do something
  }
 };

 上面也会报错,因为这个set支持传入单个参数,但是rest params默认被视为多个参数,数组形式存在。

function

  • Block-Level Functions

 块级函数,在es3之前,是不被支持的,会报语法错误,但是浏览器会支持他,可是每个浏览器的支持是不同的,存在差异。  目前在es5的严格模式下,也会出错。es6中是被很好的支持。但是有些地方需要注意。   严格模式下:

'use strict'
if (true) {

  console.log(typeof doSomething);        // "function"

  function doSomething() {
      // ...
  }

  doSomething();
}

console.log(typeof doSomething); // undefined

 这个例子可以看出很多的东西了。首先他也会进行提升,在未声明的时候,就可以获取到类型,这是因为被提升到块级顶级了。然后在外部访问函数,是访问不到的。 如何让他不被提升呢?可以使用let/const

上面是一个严格的模式下,那么非严格模式呢?

if (true) {

    console.log(typeof doSomething);        // "function"

    function doSomething() {
        // ...
    }

    doSomething();
}

console.log(typeof doSomething);            // "function"

他是忽视了块级,进行了全局的提升。

es6引入了新的函数Arrow Function

  • arrow function
    • No this, super, arguments, and new.target bindings
    • Cannot be called with new
      MyType = () => {},
      object = new MyType();  // error - you can't use arrow functions with 'new'
    • No prototype
    • Can't change this
    • No arguments object
      const girl = (name = 'friend') => console.log(arguments) //error - ReferenceError: arguments is not defined
    • No duplicate named parameters