什么是闭包? 有什么作用?
答:1、闭包是指有权限访问另一个函数作用域中变量的函数,一般情况下在一个函数内部创建另一个函数。2在JS中,内部的函数可以调用外部函数的所有变量,而外部函数不能调用内部函数的变量,所以要通过调用内部函数的方法来获取内部函数的变量,使其一直保存在内存中,方便调用。
setTimeout 0 有什么作用
答:setTimeout 0 表示立即插入,但不是立即执行,而是等其他代码执行完之后再执行。作用
例子里发现
console.log(2)
被放到最后执行,虽然setTimeout 0
是让其0延迟执行,但是setTimeout 0
的优先级比较低,所以就放在了最后执行,使用setTimeout 0
可以保证某一段语句,放在某一个代码中最后一段执行。
下面的代码输出多少?修改代码让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 ++) {
fnArr[i] = function(n){
return function(){
return n
}
}(i);
}
console.log( fnArr[3]() ); //
方法二
var fnArr = [];
for (var i = 0; i < 10; i ++) {
(function(n){
fnArr[i] = function (){
return n;
};
})(i);
}
console.log( fnArr[3]() );
使用闭包封装一个汽车对象,可以通过如下方式获取汽车状态
var Car = //todo;
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
function mycar(){
var i = 0
function setSpeed(j){
i = j
}
function getSpeed(){
return i
}
function accelerate(){
i +=10
}
function decelerate(){
i -=10
}
function getStatus(){
if(i>0){
return "running"
}else{
return "stop"
}
return{
steSpeed:setSpeed,
gerSpeed:getSpeed,
accelerate:accelerate,
decelerate:decelerate,
getStatus: getStatus
}
}
}
写一个函数使用setTimeout模拟setInterval的功能
function setInterval(func,Interval){
return setTimeout(function(){
func();
Interval(func,Interval)
},Interval)
}
写一个函数,计算setTimeout平均[备注:新加]最小时间粒度
function fn(){
var i = 0;
var start = Date.now()
var clock = setTimeout(function (){
i++
if (i<1000){
setTimeout(arguments.callee,0)
}else{
clearTimeout(clock)
var end = Date.now()
console.log((end-start)/i)
}
},0)
}
fn()
下面这段代码输出结果是? 为什么?
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 flag = true;
setTimeout(function(){
flag = false;
},0)
while(flag){}
console.log(flag);
没有结果,因为flag一直为真,轮不到setTimeout执行,为死循环。
下面这段代码输出?如何输出delayer: 0, delayer:1...(使用闭包来实现)
for(var i=0;i<5;i++){
setTimeout(function(){
console.log('delayer:' + i );
}, 0);
console.log(i);
}
console.log(i);}
for(var i=0;i<5;i++){
(function fn(num){
setTimeout(function (){
console.log("dalayer:"+num)
},0)
})(i)
console.log(i)
}
本文版权归本人和饥人谷所有,转载请注明来源。
网友评论