小练习:
题目1: 下面的代码输出多少?修改代码让 fnArri 输出 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++) {
(function(i) {
fnArr[i] = function() {
return i;
};
})(i);
}
console.log(fnArr[3]()); // 3
改写方法二:
var fnArr = [];
for (var i = 0; i < 10; i++) {
fnArr[i] = (function(i) {
return function() {
return i;
};
})(i);
}
console.log(fnArr[3]()); // 3
var Car = (function() {
var speed = 0;
function setSpeed(s) {
speed = s;
}
function getSpeed() {
console.log(speed);
}
function accelerate() {
speed += 10;
}
function decelerate() {
speed -= 10;
}
function getStatus() {
if (speed > 0) {
console.log('running');
} else {
console.log('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
由于setTimeout
异步延迟,里面的内容需要等到同步代码结束后才能执行,所以实际的代码执行顺序为:
var a = 1;
var a;
console.log(a); // 1
a = 3;
console.log(a); // 3
(function() {
a = 2;
console.log(a);
})(); // 2
var flag = true;
setTimeout(function() {
flag = false;
}, 0);
while (flag) {}
console.log(flag);
最终不会输出任何结果,由于定时器的存在,解析器将会优先执行其余代码;
执行到while (flag) {}
时,由于flag = true;
,代码将会继续执行,但函数内部没有任何代码信息,所以不会有输出。
for(var i=0;i<5;i++){
setTimeout(function(){
console.log('delayer:' + i );
}, 0);
console.log(i);
}
for (var i = 0; i < 5; i++) {
(function(i) {
setTimeout(function() {
console.log('delayer:' + i);
}, 0);
})(i);
}
<input type="button" id="button" class="button" value="点击我,显示宽高" />
.button {
height: 24px;
border: 0;
border-radius: .2em;
background-color: #34538b;
color: #fff;
font-size: 12px;
font-weight: bold;
}
document.getElementById("button").onclick = function() {
var oStyle = this.currentStyle ? this.currentStyle : window.getComputedStyle(this, null);
alert('height: ' + oStyle.height + ' width: ' + oStyle.width);
};
参考信息:http://www.zhangxinxu.com/wordpress/2012/05/getcomputedstyle-js-getpropertyvalue-currentstyle/
- 2种编码方式:
encodeURI()
:不会对下列字符编码:ASCII字母、数字、~!@#$&*()=:/,;?+'
encodeURIComponent()
:不会对下列字符编码:ASCII字母、数字、~!*()'
- 2种解码方式:
decodeURI()
decodeURIComponent()
URL 的编码格式采用的是 ASCII码,一般来说,URL只能使用英文字母、阿拉伯数字喝某些标点符号,其余特殊符号便需要进行转码,同时也是为了提升安全性。
参考信息:
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);
}