下面的代码输出多少?修改代码让 fnArr[i]()
输出 i
。使用 两种以上的方法
var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i] = function(){
return i;
};
}
console.log( fnArr[3]() ); // 输出10
改造如下:
var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i] = (function(j){
return function(){
return j;
}
})(i)
}
console.log( fnArr[3]() ) // 3
var fnArr = [];
for (var i = 0; i < 10; i ++) {
!function(i){
fnArr[i] = function(){
return i;
}
}(i)
}
console.log( fnArr[3]() ) // 3
var fnArr = [];
for (let i = 0; i < 10; i ++) {
fnArr[i] = function(){
return i;
}
}
console.log( fnArr[3]() ) // 3
封装一个汽车对象,可以通过如下方式获取汽车状态
var Car = (function(){
var speed = 0;
function setSpeed(s){
speed = s
}
...
return {
setSpeed: setSpeed,
...
}
})()
Car.setSpeed(30);
Car.getSpeed(); //30
Car.accelerate();
Car.getSpeed(); //40;
Car.decelerate();
Car.decelerate();
Car.getSpeed(); //20
Car.getStatus(); // 'running';
Car.decelerate();
Car.decelerate();
Car.getStatus(); //'stop';
//Car.speed; //error
var Car = (function(){
var speed = 0;
function setSpeed(s){
speed = s;
}
function getSpeed(){
return speed;
}
function accelerate(){
speed += 10;
}
function decelerate(){
speed -= 10;
}
function getStatus(){
if (speed > 0) {
return 'running';
} else {
return 'stop';
}
}
return {
setSpeed: setSpeed,
getSpeed: getSpeed,
accelerate: accelerate,
decelerate: decelerate,
getStatus: getStatus,
//...
}
})()
Car.setSpeed(30);
Car.getSpeed(); //30
Car.accelerate();
Car.getSpeed(); //40;
Car.decelerate();
Car.decelerate();
Car.getSpeed(); //20
Car.getStatus(); // 'running';
Car.decelerate();
Car.decelerate();
Car.getStatus(); //'stop';
//Car.speed; //error
下面这段代码输出结果是? 为什么?
var a = 1;
setTimeout(function(){
a = 2;
console.log(a);
}, 0);
var a ;
console.log(a);
a = 3;
console.log(a);
输出结果为:1, 3, 2 ;
原因:
var a = 1;
// 异步执行,setTimeout, 将当前全部执行完成0秒之后再执行 setTimeout 中的函数
setTimeout(function(){
a = 2;
console.log(a); // 此时 a = 2; 最后执行
}, 0);
var a ;
console.log(a); // 此时 a = 1; 优先执行
a = 3;
console.log(a); // 此时 a = 3;
下面这段代码输出结果是? 为什么?
var flag = true;
setTimeout(function(){
flag = false;
},0)
while(flag){}
console.log(flag);
输出结果: 无任何输出;
原因: while(flag){}
中 flag
为 true 为死循环,页面会一直加载,无输出。
下面这段代码输出?如何输出delayer: 0, delayer:1...(使用闭包来实现)
for(var i=0;i<5;i++){
setTimeout(function(){
console.log('delayer:' + i );
}, 0);
console.log(i);
}
输出结果:
![](https://img.haomeiwen.com/i7812006/ae543f523c6a4fad.png)
代码改造如下
for(var i=0;i<5;i++){
function fn(i){
return function(){
console.log('delayer:' + i )
}
}
setTimeout(fn(i),0)
console.log(i)
}
如何获取元素的真实宽高
window.getComputedStyle(element, [pseudoElt]).height;
window.getComputedStyle(element, [pseudoElt]).width;
// 第一个参数为元素名,第二个为伪类,可选
URL 如何编码解码?为什么要编码?
-
编码方式:
encodeURI()
encodeURIComponent()
区别:
encodeURI
方法不会对下列字符编码ASCII字母、数字、~!@#$&* ()=:/,;?+'
encodeURIComponent
方法不会对下列字符编码ASCII字母、数字、~!*()'
所以encodeURIComponent
比encodeURI
编码的范围更大。 -
解码方式:
decodeURI()
decodeURIComponent()
-
原因
一般来说,URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号。比如,世界上有英文字母的网址"http://www.abc.com"
,但是没有希腊字母的网址"http://www.aβγ.com"
(读作阿尔法-贝塔-伽玛.com)。这是因为网络标准RFC 1738做了硬性规定:
"...Only alphanumerics [0-9a-zA-Z], the special characters "$-.+!*'()," [not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL."
"只有字母和数字[0-9a-zA-Z]、一些特殊符号"$-.+!*'(),"[不包括双引号]、以及某些保留字,才可以不经过编码直接用于URL。"
这意味着,如果URL中有汉字,就必须编码后使用。
参考:http://www.ruanyifeng.com/blog/2010/02/url_encoding.html
补全如下函数,判断用户的浏览器类型
function isAndroid(){
return /android/i.test(navigator.userAgent);
}
function isIphone(){
return /iphone/i.test(navigator.userAgent);
}
function isIpad(){
return /ipad/i.test(navigator.userAgent);
}
function isIOS(){
return /iphone|ipad/i.test(navigator.userAgent);
}
网友评论