JS笔试题研究

62 阅读3分钟

代码

面试遇到代码,自己加了debugger一下

const ab=1
let ac=1
debugger
const fn = (function(){
    debugger
    ad=1
    var aa = 2
    var ae
    console.log(aa,window.aa,window.ab)  //2 1 undefined
    window.aa=5
    let ac=2
    debugger
})()
ad=2
window.aa=3
console.log(aa,ab,ac,ad,ae,window.aa,window.ab,window.ac,window.ad,window.ae);  //3, 1 ,1 ,2 ,ae is not defined(ae会报错), 3, undefined ,undefined ,2   ,undefined
var aa=4  //行为? 重新给window上的aa属性赋值
let aa=5  //行为? Identifier 'aa' has already been declared
const aa=6  //行为?  Identifier 'aa' has already been declared
debugger

调试

image.png let和const顶层声明变量作用域为脚本,var声明的aa才会挂在window上

image.png

image.png console出来是2 1 undefined

立即执行函数的内部,未声明直接赋值的变量ad在函数内部作用域找不到,所以会挂载到全局window上;内部的本地变量aa和ac声明赋值不会改变全局的aa和脚本的ac,是独立的,这里面的var变量aa提升提不到全局window上去

image.png console出来是3, 1 ,1 ,2 ,ae is not defined(ae会报错), 3, undefined ,undefined ,2 ,undefined

let和const都不能重复声明,var可以,改的是window上的

总结

使用 let / const 声明的全局变量,会被绑定到Script对象而不是Window对象,不能以Window.xx 的形式使用;使用 var 声明的全局变量和未声明直接赋值的变量会被绑定到Window对象;使用var / let / const 声明的局部变量都会被绑定到 Local 对象。

立即执行函数内部形成了一个单独的作用域,var声明变量提升提不出去,作为局部变量。

我的评价是,现在真不用var了😥

附其他题目

//题1
var a=1;
debugger
(function () {
    debugger
    console.log(a)  //undefined,var变量提升到函数内顶部,此时只声明未赋值
    a=2  //函数内作用域有a,故赋值
    console.log(a,window.a)  //2  1  ,不影响window.a
    debugger
    var a=3
    console.log(a)  //3   var可以重复声明,a赋值为3
})()

//题2
var a = 1;
console.log(fn1(3));  //4
function fn1(b) {
    var a = 2;  //函数内部var声明的是局部变量而非全局变量
    debugger
    return fn2(b);
}
function fn2(b){
    console.log(a,b,a+b)  //1,3,4
    return a + b;
}

//题3
function func1() {}
function func2() {}        
func1.prototype = func2.prototype = {}
console.log(func2.prototype = {})  //返回值是一个空对象,proto指向Object
const son = new func1();
console.log(son instanceof func1, son instanceof func2); //true false


//题4,很神奇的一道,加了debugger就打印3,不加就报错,

(function(){ 
^
TypeError: 3 is not a function

var b = 3
(function(){ 
    b= 5
    var b = 2
})()
console.log(b) //报错,TypeError: 3 is not a function


var b = 3
debugger
(function(){ 
    debugger
    b= 5
    debugger
    var b = 2
    debugger
})()
console.log(b) //打印3
debugger


//题5 
var a = 1;
a = (a++)+(++a)- (a--) - (--a);  //a最终为0


//题6
["1",2,"3"].map(parseInt)  //结果为[1, NaN, NaN]

//题7
typeof 99 + 'sample'  //'numbersample'先左边得'number'再拼接字符串

//题8
console.info(parseInt("2021-10-1")); //2021
console.info(parseInt("2021nowcoder"));  //2021
console.info(parseInt("nowcoder2021"));  //NaN

//题9
var a = 1;
function fn1(b) {
    var a = 2 ;
    return fn2(b);
}
function fn2(b) {
    return a + b;
}
console.log(fn1(3)) ;   //4


//题10
var num = 1;
(function(){
    console.log(num)  //undefined
    num = 2
    console.log(window.num) //1
    var num = 3;
    console.log(num)  //3
})()