学习来源:JS基础知识(覆盖JS基础面试题)
3、作用域及闭包
3.1、变量提升
以下两种情况会进行提升:
- 变量定义
- 函数说明
3.2、this的几种不同的使用场景
- 在构造函数中使用(构造函数本身)
- 作为对象属性时使用(调用属性的对象)
- 作为普通函数时使用(window)
- call,apply,bind(执行的第一个参数)
var a={
name: 'A',
fun: function(){
console.log(this.name);
}
};
a.fun(); //this === a
a.fun.call({ name: 'B'}); //this === {name: 'B'}
fun1();
3.3、创建十个a标签,点击每个弹出对应序号
var i;
for (i = 0; i < 10; i++) {
(function(i) {
// 函数作用域
var a = document.createElement('a');
a.innerHTML = i + '<br>';
a.addEventListener('click', function(e) {
e.preventDefault();
alert(i);
});
document.body.appendChild(a);
})(i);
}
3.4、如何理解作用域
-
自由变量
-
作用域链,及自由变量的查找,找不到逐级向上找
-
闭包的两个场景
- 函数作为变量传递
- 函数作为返回值
3.5、实际开发中闭包的应用
//判断一个数字是否出现
function idFirst(){
var _list = [];
return function(id){
if(_list.indexOf(id) >= 0){
return false;
}else{
_list.push(id);
return true;
}
};
}
var first = isFirst();
first(10);
first(10);
first(30);
4、单线程和异步
4.1、同步和异步的区别,
列举一个同步和异步的例子
同步会堵塞代码,但异步不会,alert是同步,setTimeout是异步的
4.2、关于setTimeout的笔试题
console.log(1);
setTimeout(function(){
consnsolg.log(2);
},0);
console.log(3);
setTimeout(function(){
console.log(4);
},1000);
console.log(5);
//输出结果:13524
4.3、前端使用异步的场景
- 定时任务:setTimeout,setInterval
- 网络请求:ajax请求,动态img加载
- 事件绑定
需要等待的情况下都需要异步,因为不会像同步那样堵塞
5、日期和Math
5.1、日期
console.log(Date now()); //获取当前毫秒数
var dt = new Date(); //获取当前时间
console.log(dt.getTime); //当前时间的毫秒数
console.log(dt.getFullYear()); // 年
console.log(dt.getMonth()+1); // 月(0-11)
console.log(dt.getDate()); // 日(0-31)
console.log(dt.getHours()); // 时(0-23)
console.log(dt.getMinutes()); // 分(0-59)
console.log(dt.getSeconds()); // 秒(0-59)
5.2、Math
- Math.random() -返回0-1之间的随机数
- Math.abs(x) -返回数的绝对值
- Math.ceil(x) -向上取整
- Math.floor-向下取整
5.3、常用数组api
- forEach(遍历所有元素)
var arr = ['a','b','c','d'];
arr.forEach(function(item,index){
console.log(item + ',' + index);
})
- map(对数组进行重新组装,生成新的数组)
//map,生成新数组,不改变原来数组的格式
var arr = ['a','b','c','d'];
var result = arr.map(function(item,index){
return index + '/' + item;
})
console.log(result);
- sort(对数组进行排序)
//sort,会改变原来数组
var arr = [1,23,4,5];
var result = arr.sort(function(a,b){
//从小到大排序
return a - b;
//从大到小排序
return b - a;
})
console.log(result);
- filter(过滤符合条件的元素)
var arr = [1,2,3,4];
var result = arr.filter(function(item,index){
if(item < 3){
return true;
}
})
console.log(result);
- every(判断所有元素是否都符合要求)
var arr = [1,2,3,4];
var result = arr.every(function(item,index){
if(item < 3){
return true;
}
})
console.log(result); //false
- some(判断是否至少有一个元素符合条件)
var arr = [1,2,3,4];
var result = arr.some(function(item,index){
if(item < 3){
return true;
}
})
console.log(result); //true
- join(根据条件对数组组合成字符串)
var arr = [1,2,3,4];
var result = arr.join(',');
console.log(result);
- reverse(将数组反转)
var arr = [1,2,3,4];
var result = arr.renerse();
console.log(result);
5.4、常用的对象api
- for in
- hasOwnProperty(检查属性是不是对象自由的,排除从原型链找到的属性)
var obj = {
x: 10,
y: 20,
z: 30
}
for(var key in obj) {
if(obj.hasOwnProperty(key)){
console.log(key + ';' + obj[key]);
}
}
6、常见问题
6.1、获取当前日期
function formatDate(dt){
if(!dt){
dt new date();
}
var year = dt.getFullYear();
var month = dt.getMonth() + 1;
var date = dt.getDate();
if(month < 10){
month = '0' + month;
}
if(date < 10){
date = '0' + date;
}
return year + '-' + month + date;
}
var newDate = new Date();
var formatDate = formatDate(nowDate);
console.log(formatDate);
6.2、获取随机数
要求长度一致的字符串格式
function randomStr(len){
var random = Math.random();
random = random + '000000'; //防止自动生成的数字不满足长度报错,并且强制转成字符串
return random.substr(0,len);
}
console.log(randomStr(20));
6.3、写一个能遍历对象和数组的通用forEach函数
function forEach(obj,fn){
if(obj instanceof Array){ //如果是数组
obj.forEach(function(item,index){
fn(index,item);
})
}else{ //是个对象
for( var k in obj){
if(obj.hasOwnProperty(key)){
fu(key,obj[key]);
}
}
}
}
var arr = [1,2,3,4];
forEach(arr,dunction(index,item){
console.log(index + ',' + item);
})
var obj = {
x: 10,
y: 20
};
forEach(obj,function(index,item){
console.log(index + "," + item);
});
\