下面的代码输出,修改代码让 fnArri 输出 i。
var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i] = function(){
return i;
};
}
console.log( fnArr[3]() );
//此为原题
//输出等于10 .因为全局就只有一个i = 10..return的也是全局的这个值.
方法一:
var fnArr = [];
for (var i = 0; i < 10; i ++) {
!function(i) {
fnArr[i] = function() {
return i;
};
}(i)
}
console.log( fnArr[3]() );
方法二:
var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i] = (function (i) {
return function() {
return i
}
})(i)
}
console.log( fnArr[3]() );
方法三:
var fnArr = [];
for (let i = 0; i < 10; i ++) {
fnArr[i] = function(){
return i;
};
}
console.log( fnArr[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
<script>
var Car = (function() {
var speed = 0;
function setSpeed(arg) { //设置速度
speed = arg
console.log('您设置设置速度为:' + arg)
}
function getSpeed() { //获取速度
console.log('当前速度: '+ speed)
}
function accelerate() { //加速
speed += 10;
console.log('提速: 10_目前速度:' + speed)
}
function decelerate() { //减速
speed -= 10;
console.log('减速: 10_目前速度:' + speed)
}
function getStatus() { //获取状态
//speed > 0 ? console.log('running'):console.log('stop');
console.log(speed > 0 ? '车辆处于行驶状态' : '车辆处于停止状态');
}
return {
'setSpeed' : setSpeed,
'getSpeed' : getSpeed,
'accelerate' : accelerate,
'decelerate' : decelerate,
'getStatus' : getStatus
}
})()
Car.setSpeed(30); //您设置设置速度为:30
Car.getSpeed(); //当前速度: 30
Car.accelerate(); //提速: 10_目前速度:40
Car.getSpeed(); //当前速度: 40
Car.decelerate(); //减速: 10_目前速度:30
Car.decelerate(); //减速: 10_目前速度:20
Car.getSpeed(); //当前速度: 20
Car.getStatus(); //车辆处于行驶状态
Car.decelerate(); //减速: 10_目前速度:10
Car.decelerate(); //减速: 10_目前速度:0
Car.getStatus(); //车辆处于停止状态
</script>
下面这段代码输出结果
var a = 1;
setTimeout(function() {
a = 2;
console.log(a);
}, 0);
var a ;
console.log(a);
a = 3;
console.log(a);
//输出结果:
//输出: [1] 原因:前面 [var a = 1][var a (多余声明)]很好理解,唯一问题就落在定时器[setTimeout]这里.它会等其他函数执行完再执行.
//输出: [3] 原因:前面 [a = 3] 赋值于全局 得出此结果
//输出: [2] 原因:定时器 [setTimeout] 的 [a = 2] 赋值于全局 a
下面这段代码的输出结果
var flag = true;
setTimeout(function() {
flag = false;
},0)
while(flag){}
console.log(flag);
//跳过定时器[setTimeout]最后执行
//循环(条件:true){内容}.没终止的条件_致死循环
//console.log:等着..永远轮不到...
下面这段代码的输出?如何输出delayer: 0, delayer:1...(使用闭包来实现)
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)
console.log(i);//0 1 2 3 4 5
}
如何获取元素的真实宽高
首先我们要获取元素节点,var node = document.querySelector('#id'),然后利用window对象的getComputedStyle来获取相应的css属性,比如:window.getComputedStyle(node).height/width返回的是相应的宽高,单位为像素.
URL 如何编码解码?为什么要编码?
- 编码的方式有两种,第一种是使用encodeURI();参数为一个url字符串或字符串对象,通过这种方式编码的url相比encodeURIComponent()编码的将会把元字符和语义字符之外的字符,都进行转义,而后者除了语义字符之外的字符,元字符也会被转义。因此,它的参数通常是URL的路径或参数值,而不是整个URL。
- 编码的作用无非就是为了使用起来更加方便轻巧且易于区分,避免造成误会比如当我门要返回一个网址的时候,?back=xxx&value = return.这样便不会把后面的value也当成了前一个网页的参数值.
补全如下函数,判断用户的浏览器类型
var test = window.navigator.userAgent;
console.log(test);
function isAndroid(){
if(/Android/i.test(test)){
return console.log('isAndroid');
}
}
function isIphone(){
if(/iPhone/i.test(test)){
return console.log('isIphone');
}
}
function isIpad() {
if(/iPad/i.test(test)){
return console.log('isIpad');
}
}
function isIos(){
if(/iPad/i.test(test)){
return console.log('isIpad');
}
}
function isMac() {
if(/Macintosh/i.test(test)){
return console.log('isMac');
}
}
isAndroid();
isIphone();
isIpad();
isIos();
isMac();
=====