冷知识!
1、flex-grow:1; flex-grow:2; flex-grow:1;
flex-grow:2;是否是flex-grow:1;的两倍?
答案是否定的:flex-grow ,如果三个块状有基础宽度,那么flex-grow将是(窗口总宽度-三个块基本宽度)/ 份数,即 剩余宽度/份数
2、constructor 指向构造他的函数 ,什么是构造函数?无脑解释new了之后(创建实例)就是构造函数
function TheFunc(){ } TheFunc.prototype.name="iwen"; TheFunc.prototype.age = "30" let func = new TheFunc(); console.log(func.constructor)--TheFunc(){}
3、__proto__原型链 逐级向上寻找,直到最后一个没有__proto__寻找结束(最简单的原型链解释)
4、异步-异步分为宏任务,微任务,微任务执行在宏任务前面,什么是宏任务?如:setTimeout(()=>{}) 什么是微任务如new Promise((resolve,reject)=>{})
5、为何报错b is not defined?以下代码最佳解释-js垃圾回收机制,运行完函数,将会销毁局部变量,b存在的地方是local,而a存在的地方是script,运行完函数后b已经被销毁掉了(函数外部访问不到内部变量的原理其实就是垃圾回收机制)
let a = 2 function thisFunc (){ let b = 1; console.log(a) } thisFunc() console.log(b)
6、非严格模式,如下代码,声明顺序
()(function(){ var a = b = 10 }) console.log(a) console.log(b) //分解上述函数:b=10; var a=b b在非严格模式下并未声明,则全局变量b = 10; b的值不会被js销毁,而a的值是局部变量将会被销毁
7、变量提升函数优先var声明,如下输出func is not a funcation---公式var func ---> func = function func ----> func = 123
var --- func同名函数 都将预解析
var func = 123 function func(){ console.log(func) func = 456 console.log(func) } func()
(function d (num){console.log(num);var num = 20;function num(){}})(100) //输出顺序 function d(num){ var num; num = function num(){ } console.log(num) num = 20 } d(100) //由于function同名始终是最高的执行级,自然结果将是function
那么什么时候不会触发预解析呢?
代码块中将不触发预解析,如下
function a (){ console.log(a1) console.log(a2) console.log(b1) console.log(b2) if(false){ var a1 = 10; function b1(){} } if(true){ var a2 = 100; function b2(){} } console.log(a1) console.log(b1) console.log(a2) consol.log(b2) } a() //var 声明 及 function声明都在块中,将不会存在预解析,执行了得才会有值
8、apply、call
apply调用方法 function.apply(obj,arg) ,将会改变function指针的指向(this)指向的是obj call调用方法function.call(obj,a,b......) 将会改变function指针指向(this)指向的是obj 区别:传参的方式不同,apply arg是一个数组,而call则是字符串
9、匿名函数写法
(function d(a){console.log(a)})(10) 等价于 (function d(a){console.log(a)}(10)) 等价于 function d(a){ console.log(a) } d()