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、实际开发中的闭包的作用