laihuamin / JS-total

JS的流程图,每一个知识点都会配上相应的博客和面经

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

面试篇——JS系列(四)

laihuamin opened this issue · comments

学前端也快一年了,最近想试试大公司的面试,然后这里把所有的知识点都整理出来,然后慢慢消化。该片总字数:1861,速读三分半钟,普通阅读五分钟。有兴趣的可以关注一下我的blog

总的知识点概览

语法、数据类型、运算、对象、function、继承、闭包、作用域、原型链、事件、RegExp、JSON、Ajax、DOM、BOM、内存泄漏、跨域、异步加载、模板引擎、前端MVC、前端MVVM、路由、模块化、Http、Canvas、jQuery、EMCAScript、ES6、NodeJS、Vue、React

描述

一般来说,一个函数是可以供外部调用的“子程序”(或者供内部调用比如递归),在JS中,函数是一等公民,因为它可以像任何对象一样拥有方法和属性。与其他对象的区别是可以被调用。

函数声明

函数的定义中有两种函数声明和函数表达式,而函数声明就是其中的一种。

function name([param[,param[,...param]]]){statements}
  • name 函数名
  • param 传递给函数的参数名称,一个函数最多可以有255个
  • statements 组成函数的语句

函数表达式

不以function开头的就是函数表达式。

var myFunction = function() {
  statements
}

当函数只使用一次时,一般使用IIFE,如以下这种形式

(function() {
    statements
})();

IIFE是在函数声明后立即调用的函数表达式。

函数声明vs函数表达式

我们先来举个例子:

//函数声明
function foo() {}
//函数表达式
var foo = function () {}

方法一和方法二都是创建一个函数,且都是命名为foo,但是两者还是有区别的,js解析器中存在一种变量(函数)声明被提升的机制,也就是说变量(函数)声明会被提升到最前端,即使写在最后面的也会被提升到最前方。

我们可以看个例子:

console.log(foo); // function foo() {}
console.log(bar); // undefined
function foo() {}
var bar = function bar_fn() {};
console.log(foo); // function foo() {}
console.log(bar); // function bar_fn() {}

箭头函数

箭头函数表达书存在着更简短的语法。

//第一种
([param][, param]) => {statements}
//第二种
param => expression
  • param

参数名称,零参数需要用()表示,只有一个参数的时候不需要用括号

  • statements or expression

多个声明statements需要用大括号扩起来,单个的时候不需要。expression也表示隐式返回值。

举两个例子:

//第一种
(a, b) => {
  var c = a + b;
  return c;
}
//第二种
n => n + 1

参数(arguments)对象

  • arguments:一个包含了传递给当前执行函数参数的类似于数组的对象——类数组对象
  • arguments.callee:只当前正在执行的函数(不过不建议使用)
  • arguments.length:传递参数的数目

block-level函数

从ES6开始,在严格模式下禁止使用块里的函数作用域。举个例子

'use strict';

function f() {
  return 1;
}
//block-level函数
{
  function f() {
    return 2;
  }
}

f() === 1;// true

在非严格模式下,也不要用。块中的函数声明表现奇怪。

if (shouldDefineZero) {
   function zero() {     // DANGER: 兼容性风险
      console.log("This is zero.");
   }
}

在ES6中,shouldDefineZero为false,那么zero永远不会被定义,但是存在历史遗留问题,ES6是新的标准,但是在以前,无论这个块是否执行,一些浏览器都会定义zero。

更加安全的方式是使用函数表达式:

var zero;
if (0) {
   zero = function() {
      console.log("This is zero.");
   };
}