有关JS的面试题

133 阅读3分钟

习题一

var a = 10;
function test(){
    a = 100;
    console.log(a)
    console.log(this.a)
    var a
    console.log(a)
}
test()

考察点

  • 变量提升
  • 预解析
  • this(函数无调用者 this==window)
var a = 10;
function test(){
	var a
    a = 100;
    console.log(a)
    console.log(this.a)
    console.log(a)
}
test()

若将上面的var改为let,则直接报错,因为let没有变量提升

习题二(非严格模式)

(function(){
    var a = b = 3
})()
console.log(a)
console.log(b)

考察点

  • 自执行函数
  • 作用域

var a = b = 3就是b =3;var a = b a是在函数内部定义的,外部访问不到,b只是在函数内部进行了赋值,将var b 预解析到全局

若是

(function(){
    var a = b = 3
})()
console.log(b)
console.log(a)

习题三

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

考察点

  • js的事件循环
  • 等待队列
  • 异步

js是单线程(一次只能运行一个程序),如何去执行异步呢? 答:在主线程执行时,有一个异步任务也要执行的时候,只需要把异步放进等待队列中,待主线程执行完毕再执行异步(这里共有三个异步任务 setTimeout())

如果将var 改为 let 结果是:

原因是作用域不同:var是全局作用域,let是块级作用域

ES5的作用域有 函数作用域、全局作用域 ES6新加了块级作用域

习题四

function fun(v){
    console.log(v)
    var n = 456
    console.log(n)
}
var n = 123;
fun(n)

考察点

  • 作用域
  • 变量提升
  • 参数
var n;
function fun(v){
	var n;
   console.log(v);
   n = 456;
   console.log(n)
}
n = 123;
fun(n)

若没有参数n

function fun(){
   console.log(n)
   var n = 456
   console.log(n)
}
var n = 123;
fun(n)

考察点

  • 作用域
  • 变量提升
  • 参数

习题五

function fun(){
   console.log(fun) 
   fun = 456
   console.log(fun)
}
fun()
var fun = 123

变量和函数同名,函数优先

预解析中函数的优先级大于var

function fun(){
   console.log(fun) 
   fun = 456
   console.log(fun)
}
var fun = 123
fun()

将函数fun赋值给123,故fun()不再是函数

习题六

var n = 123
function f1(){
    console.log(n)
}
function f2(){
    var n = 456;
    f1()
}
f2() 
console.log(n)

考察点

  • 预解析
  • 作用域 f1() 在 f2()中执行,但是f1()无调用者,所以f1()的作用域是window

习题七

var length = 100
function f1(){
    console.log(this.length)
}
var obj = {
    x:10,
    f2:function(f1){
        f1(); // 无调用者,this指向全局
        arguments[0]() // 无调用者,作用域arguments对象,length刚好是是数组长度,f2传入俩个参数
    }
}
obj.f2(f1,1) //f2的调用者是obj

arguments[0]()就是f1()

考察点

  • 预解析
  • 作用域
  • arguments--js内置对象,可以理解为参数数值,里面包含所有传入的参数 eg:
function arg(){
    console.log(arguments)
}
arg(1,2,3,'f',3)

习题八

function f(){
    console.log(this.a)
}
var obj = {
    a:2,
    f:f // 这个值是函数f()
}
var f2 = obj.f;
var a = 'hello'
f2()   // 无调用者  this == window

考察点

  • 预解析
  • 字面量
  • 作用域

习题九

function f(s){
    console.log(this.a, s)
    return this.a + s
}
var obj = {
    a:2
}
var f2 = function(){ // 无参数接收 arguments接收
    return f.apply(obj,arguments)  /// 相当于obj调用f函数
}
var b = f2(3)
console.log(b)

考察点

  • 预解析

  • 字面量

  • apply (执行一个函数,改变this的指向)

    apply(参数一,参数二),参数一:作用域,改变之后this的指向,参数二:数组

  • argumrnts

  • 作用域

	function f(s){
    console.log(this.a, s)
    return this.a + s
}
var obj = {
    a:2
}
var f2 = function(){
    return f.call(obj,...arguments)
}
var b = f2(3)
console.log(b)

call(参数一,参数二),参数一:作用域,改变之后this的指向,参数二:直接写入,用逗号隔开