全面覆盖js核心知识点

js考察的几大核心知识

  • 原型、原型链

  • 作用域

  • 闭包

  • this

  • 继承

  • Ajax

  • ES6

[TOC]

下面代码的运行结果是什么?作用域,ES6-let

for (let i=0;i<3;i++){
    setTimeout(function (){
        console.log(i);
    },0)
}


for (var i=0;i<3;i++){
    setTimeout(function (){
        console.log(i);
    },0)
}

上面代码输出的结果分别是:

  • 0,1,2

  • 3,3,3

原因分析:

let 可以创建词法作用域, 但是var不行. 词法作用域是指作用域是在写代码或者说定义的时候决定的, 而不是在运行的时候决定的. 词法作用域是静态作用域, 而动态作用域是在运行的时候决定的.

扩展问题:

  • let还有哪些特性与优势?

  • 如果还是使用var定义变量,要怎么改写这段代码才能正常运行?闭包

下面代码的运行结果是什么? ES6-let

下面的代码运行中浏览器中

代码输出结果是:

结果分析:

在全局环境中,使用var定义的变量会挂载在全局对象上,浏览器的中全局对象就是window. 所以window修改全局对象的属性会影响到全局变量value的值。

而let定义的变量不会挂载在window全局对象上,所以修改了window.value2的值不会影响到全局变量value2的值。

下面代码的运行结果是什么? this指向箭头函数与普通的区别

下面的代码运行在浏览器中

回答:

代码输出结果是:

  • obj.sayName()中 sayName中的this指向的是obj对象本身,所以this.name就是 xiaoming;

  • obj.sayName2();中由于sayName2使用了箭头函数,箭头函数

此时的this无法判断指向哪里,只有当运行时才知道。可能指向obj,也可能指向window.主要看调用方式,如果是 obj.sayName(),则指向obj,如果是sayName(),则指向window。 但是,如果使用了箭头函数,则this指向window

扩展问题:

  • 箭头函数和普通函数还有什么区别?

  • 如何判断this的指向,有哪几种方式?

  • 如何改变this的指向?

  • call ,apply, bind有什么区别?

下面代码的运行结果是什么?变量提升(var ,funtion)

解答:

扩展题目:

  • let ,var的区别?

  • 解释下什么叫做变量提升?

下面代码的运行结果是什么?函数定义的几种方式 变量提升

答案:

原因分析:

  • 通过函数申明创建的函数存在变量提升:所以可以直接调用后面定义的函数。所以 fn1()正常执行

  • 使用var定义的变量存在变量提升,但是未运行到代码之前是undefined.运行到后面才会赋值。

  • 使用const定义的变量,不存在变量提升,会存在临时性死区。会报错。

下面代码的运行结果是什么?事件机制 DOM事件级别

答案:

解析

  • onclick="clickButton()", btn.onclick都属于DOM0级事件,后面添加的会覆盖前面的。所以只有btn.onclick绑定的事件才生效。只会输出

  • btn.addEventListener 属于DOM2级别事件,可以重复多个添加,所以都会打印出来

下面代码的运行结果是什么?js事件流 js事件机制

答案:

解析:

e.target 和 e.currentTarget的区别:

  • e.target:它的值是不会变的。因为,它只在事件捕获阶段存在,理解为真实操作的目标元素。

  • e.currentTarget:它的值会动态变化。它存在事件捕获,事件目标,事件冒泡三个阶段,会随着事件的传播而改变。

最后更新于

这有帮助吗?