JavaScript面试题整理(一)作用域和闭包

2019年11月11日整理

一、作用域和闭包的问题

首先我们要了解知识点: 执行上下文、this、作用域、作用域链和闭包,才能对下面的问题进行解答。

1、知识点:执行上下文

//函数表达式(也可以叫做变量定义)(这里会将var a提前到最前面,将a赋值为undefined)
console.log(a); //undefined
var a = 100
// 函数声明(会将function fn()提前)
fn('zhangsan') // 'zhangsan' 20
function fn(name){
    age = 20
    console.log(name,age);
    var age
}

执行上下文的范围:是一段<script>或者是一个函数

  全局:变量定义、函数声明  =》一段<script>

  函数:变量定义、函数声明、this、arguments =>函数(注:this、arguments是在函数执行之前就定义好了,arguments是函数内所有参数的集合)

2、知识点:this

this要在执行时才能确认值,定义时无法确认

this:作为构造函数执行、作为对象属性执行、作为普通函数执行、call,apply,bind

(1)、构造函数中的this,(先把this赋值成一个空对象{ },再给this添加属性name,最后返回this给f)

//构造函数中的this(先把this赋值成一个空对象{},再给this添加属性name,最后返回return this给f)
function Foo(name) {
    this.name = name
}
var f = new Foo('zhangsan')

(2)、对象属性中的this(其中this的指向为obj)

//对象属性中的this(其中this的指向为obj)
var obj = {
    name : 'A',
    printName: function(){
        console.log(this.name);
    }
}
obj.printName()

(3)、普通函数中的this(指向的是window)

//普通函数中的this
function fn() {
    console.log(this); //this === window
}
fn();

(4)、call 、apply 、bind

//call、apply、bind
// (1)、call,改变this的指向为call的第一个参数{x:100}
function fn1(name,age) {
    alert(name)    //zhangsan
    console.log(this);    //Object {x:100}
}
fn1.call({x:100},'zhangsan',20)
// (2)、apply,与call的差别是传递的第二个参数是数组
function fn1(name) {
    alert(name)    //zhangsan
    console.log(this);    //Object {x:100}
}
fn1.call({x:100},['zhangsan',20])
//(3)、bind 函数在执行的时候就已经用bind改变了this的指向,.bind必须是一个函数表达式
var fn = function (name,age) {
    alert(name) //zhangsan
    console.log(this); //Object {{y=200}}
}.bind({y=200})
fn2('zhangsan',20)

3、作用域

1、说一下对变量提升的理解

   

2、说明this几种不同的使用场景

3、创建10个<a>标签,点击的时候弹出来对应的序号

4、如何理解作用域

5、实际开发中的闭包的作用

  • 添加到短语集
     
    • 没有此单词集: -> 中文(简体)...
       
    • 创建新的单词集...
  • 拷贝
原文地址:https://www.cnblogs.com/gengzhen/p/11838262.html