下面的代码输出多少?修改代码让 fnArri 输出 i。使用 两种以上的方法
var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i] = function(){
return i;
};
}
console.log( fnArr[3]() ); //
1.
var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i] = (function(j){
return function (){
return j;
};
})(i);
}
console.log( fnArr[3]() ); //3
2.
var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i] = (function (){
var a=i;
return function (){
return a;
};
})(i)
}
console.log( fnArr[3]() ); //3
3.
var fnArr = [];
for (var i = 0; i < 10; i++) {
(fnArr[i] = function () {
return arguments.callee.x;
}).x = i; // 将x作为函数的一个属性
}
console.log( fnArr[3]() );//3
封装一个汽车对象,可以通过如下方式获取汽车状态
var Car = (function(){
var speed = 0;
function setSpeed(s){
return speed = s
}
function getSpeed(){
return speed;
}
function accelerate(s){
return speed+=10;
}
function decelerate(s){
if(speed>=10){
return speed-=10;
}
}
function getStatus(){
if (speed>0){
return "running";
}else {
return "stop";
}
}
return {
setSpeed: setSpeed,
geSpeed:getSpeed,
accelerate:accelerate,
decelerate:decelerate,
getStatus:getStatus
}
})();
Car.setSpeed(30);
console.log(Car.geSpeed()) ; //30
Car.accelerate() ;
console.log(Car.geSpeed());//40;
Car.decelerate();
Car.decelerate();
console.log(Car.geSpeed());//20
console.log(Car.getStatus()); // 'running';
Car.decelerate();
Car.decelerate();
console.log(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()会在后面执行,先输出1,再给a赋值3,覆盖了前面的1,最后执行定时器函数,里面的a=2覆盖了之前的a=3,所以输出2.
下面这段代码输出结果是? 为什么?
var flag = true;
setTimeout(function(){
flag = false;
},0)
while(flag){}
console.log(flag);
什么也没有输出,因为flag=true,while条件为true,while就无线循环,setTimeout()会等到别的程序执行完了之后才执行,所以,flag就一直是true,循环也就一直执行。
下面这段代码输出?如何输出delayer: 0, delayer:1...(使用闭包来实现)
for(var i=0;i<5;i++){
setTimeout(function(){
console.log('delayer:' + i );
}, 0);
console.log(i);
}
1.
for(var i=0;i<5;i++){
setTimeout((function(i){
console.log('delayer:' + i );
})(i), 0);
console.log(i);
}
2.
for(var i=0;i<5;i++){
var handler=(function(i){
console.log('delayer:' + i );
})(i);
setTimeout(handler, 0);
console.log(i);
}
如何获取元素的真实宽高
function getTrueStyle(elem,name){
//如果行内样式设置了当前属性
if(elem.style[name]){
return elem.style[name];
}else if(window.getComputedStyle){
var s=window.getComputedStyle(elem,name);
return s;
}
//兼容IE
else if(elem.currentStyle){
return elem.currentStyle;
}else {
return null;
}
}
let elem = document.getElementById("elem-container");
let hei=getTrueStyle(elem).height;
let wid=getTrueStyle(elem).width;
console.log(wid);
console.log(hei);
URL 如何编码解码?为什么要编码?
url只能是字母数字和一些标点符号($-_.+!*'(),)组成,所以如果url中有别的字符或者汉字,就必须编码后使用。
1.如果对整个URL进行编码,那么使用encodeURI(),encodeURI()是Javascript中真正用来对URL编码的函数,如果URI是完整的URI,那么无需对那些保留的并且在URI中有特殊意思的字符进行编码编码后,它输出符号的utf-8形式,并且在每个字节前加上%。
var url='http://www.jianshu.com/writer#/?a="简书"&b=2';
var url1=encodeURI(url);
console.log(url1);//http://www.jianshu.com/writer#/?a=%22%E7%AE%80%E4%B9%A6%22&b=2
它对应的解码函数是decodeURI()。
console.log(decodeURI(url1));//http://www.jianshu.com/writer#/?a="简书"&b=2
2.如果对URL的组成部分进行个别编码,使用encodeURIComponent()。
与encodeURI()的区别是,它用于对URL的组成部分进行个别编码,而不用于对整个URL进行编码。"; / ? : @ & = + $ , #",这些在encodeURI()中不被编码的符号,但在encodeURIComponent()中统统会被编码,
var url='http://www.jianshu.com/writer#/?a="简书"&b=2';
console.log(encodeURIComponent(url));//http%3A%2F%2Fwww.jianshu.com%2Fwriter%23%2F%3Fa%3D%22%E7%AE%80%E4%B9%A6%22%26b%3D2
var url1=encodeURIComponent(url);
它对应的解码函数是decodeURIComponent(yrl1)//http://www.jianshu.com/writer#/?a="简书"&b=2
为什么要编码
因为URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号,所以为了使服务器正确的解析url,就要使用编码的方式。不同的操作系统、不同的浏览器、不同的网页字符集,将导致完全不同的编码结果,所以使用Javascript先对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 /(ipad)|(iphone)/i.test(navigator.userAgent);
}