题目1: 下面的代码输出多少?修改代码让 fnArr[i]() 输出 i。使用 两种以上的方法
var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i] = function(){
return i;
};
}
console.log( fnArr[3]() ); //10
//将每一次循环的i都传给j
var fnArr = [];
for (var i = 0; i < 10; i ++) {
!function(j){
fnArr[j] = function(){
return j;
};
}(i)
}
console.log( fnArr[3]() ); //
//let不可以重复声明变量
var fnArr = [];
for (var i = 0; i < 10; i ++) {
let temp = i; // var temp=i ==>9
fnArr[i] = function(){
return temp;
};
}
console.log( fnArr[3]() ); //
function sss(p1,p2){
}
//相当于
function sss(){
var p1=arguments[0]
var p2=arguments[1]
}
//∴
var a=100 //1号a
!function(a){ // 形参
a=1;
console.log('asdf'+a) //asdf1
}(a)
console.log(a) //100
VM275:3 asdf1
VM275:5 100
!function(a){
console.log(a) //99
}(99)
!function(a){ //2号a(形参)
console.log(a) //2号a
}(a) //传入1号a(arguments[0])
题目2: 封装一个汽车对象,可以通过如下方式获取汽车状态
var Car = (function(){
var speed = 0;
function setSpeed(s){
speed = s
}
function getSpeed(){
return speed;
}
function accelerate(){
return speed += 10
}
function decelerate(){
if (speed>0){
return speed -=10
}else{
return speed = 0
}
}
function getStatus(){
if (speed>0){
return 'running'
}else{
return 'stop'
}
}
return {
a: setSpeed,
getSpeed: getSpeed,
accelerate: accelerate,
decelerate: decelerate,
getStatus: getStatus,
speed: speed,
}
})()
console.log(Car.a(30));
console.log(Car.getSpeed()); //30
console.log(Car.accelerate());
console.log(Car.getSpeed()); //40;
console.log(Car.decelerate());
console.log(Car.decelerate());
console.log(Car.getSpeed()); //20
console.log(Car.getStatus()); // 'running';
console.log(Car.decelerate());
console.log(Car.decelerate());
console.log(Car.getStatus());
console.log(Car.speed); //0
题目3:下面这段代码输出结果是? 为什么?
var a = 1;
setTimeout(function(){
a = 2;
console.log(a);//2
}, 0);
var a ;
console.log(a); // 1
a = 3;
console.log(a); //3
// 输出 1 3 2,
js是单线程,当线程中没有执行任何同步代码的前提下才会执行异步代码,setTimeout是异步代码,所以setTimeout只能等js空闲才会执行
题目4:下面这段代码输出结果是? 为什么?
var flag = true;
setTimeout(function(){
flag = false;
},0)
while(flag){}
console.log(flag);
// 无输出,因为flag=true,while无法退出,无法执行接下来的代码,更无法执行异步任务
题目5: 下面这段代码输出?如何输出delayer: 0, delayer:1...(使用闭包来实现)
for(var i=0;i<5;i++){
setTimeout(function(){
console.log('delayer:' + i );
}, 0);
console.log(i);
}
//
0
1
2
3
4
undefined
5VM187:3 delayer:5
----------------------------------------------------
for(var i=0;i<5;i++){
!function (i){
setTimeout(function(){
console.log('delayer:' + i );
}, 0);
}(i)
console.log(i);
}
//
0
VM211:7 1
VM211:7 2
VM211:7 3
VM211:7 4
undefined
VM211:4 delayer:0
VM211:4 delayer:1
VM211:4 delayer:2
VM211:4 delayer:3
VM211:4 delayer:4
题目6: 如何获取元素的真实宽高
window.getComputedStyle
style属性内的值非常机械,读取的就是元素的内联style属性的值,而不是我们计算出来的实际值,所以一般情况下没什么用处
getComputedStyle是一个可以获取当前元素所有最终使用的CSS属性值。返回的是一个CSS样式声明对象([object CSSStyleDeclaration])
(一看这个函数的名字我们就知道问题解决了)
低版本IE要用element.currentStyle()
function getStyle(e) {
return e.getComputedStyle() ? window.getComputedStyle(e) : e.currentStyle }
let trueWidth = getStyle(e).width;
let trueHeight = getStyle(e).height;
题目7: URL 如何编码解码?为什么要编码?
JavaScript提供四个URL的编码/解码方法。
decodeURI()
decodeURIComponent()
encodeURI()
encodeURIComponent()
区别
- encodeURI方法不会对下列字符编码
- ASCII字母
- 数字
- ~!@#$&*()=:/,;?+'
- encodeURIComponent方法不会对下列字符编码
- ASCII字母
- 数字
- ~!*()'
所以encodeURIComponent比encodeURI编码的范围更大。
实际例子来说,encodeURIComponent会把http://
编码成http%3A%2F%2F
而encodeURI却不会。
如果你需要编码整个URL,然后需要使用这个URL,那么用encodeURI。 encodeURI("http://www.cnblogs.com/season-huang/some other thing");
//"http://www.cnblogs.com/season-huang/some%20other%20thing";
其中,空格被编码成了%20。但是如果你用了encodeURIComponent,那么结果变为
"http%3A%2F%2Fwww.cnblogs.com%2Fseason-huang%2Fsome%20other%20thing"
当你需要编码URL中的参数的时候,那么encodeURIComponent是最好方法。
题目8: 补全如下函数,判断用户的浏览器类型
function isAndroid(){
return /Android/.test(navigator.userAgent);
}
funcnction isIphone(){
return /iphone/.test(navigator.userAgent);
}
function isIpad(){
return /ipad/.test(navigator.userAgent);
}
function isIOS(){
return /(iphone)|(ipad)/i.test(navigator.userAgent);
}