十道函数面试题

1.var i=10;
function a(){
i = 20;
console.log(i);
for (var i=0; i<6;i++){
console.log(i);
}
}
//this指代当前的window对象作用域,外部环境不能访问内部环境中任何变量和函数
console.log(this.i);//输出10
console.log(i);//输出6,当前的局部变量在循环时被赋值6

2.var a=[1,2,3];
var b=a;
b.push(4);
alert(a);//结果为[1,2,3,4] 当b改变的时候a也发生了改变

当b重新被赋值的时候 a不会改变.示例:
var a=[1,2,3];
var b=a;
b=[1,2,3,4]
alert(a)//结果为[1,2,3]
解析:变量修改的时候另一个变量会跟着变化,但是当变量重新被定义时,则另一个不变化;

3.var a=10;
function aaa(a){
alert(a);
var a=20; //因为 a 是形参,优先级高于 var a; 所以 局部变量a的声明其实被忽略了。
}
aaa(a); //结果为:10
解析:当参数跟局部变量重名的时候,优先级是等同的

4.function aaa(){
alert(a);
var a=20;
}
aaa(); //结果为:undefined
/**************/
var a=10;
function aaa(){
alert(a);
var a=20;
}
aaa(); //结果为:undefined
可以解析为是:
var a=10;
function aaa(){
var a; //声明提前了
alert(a);
a=20; //赋值扔留着原地
}
aaa();
解析:变量的查找是就近原则去寻找,定义的var变量;第二点,变量的声明被提前到作用域顶部,赋值保留在原地,如下dome;

5var a=10;
function aaa(){
alert(a);
};
aaa(); //a 为外部变量即全局变量,所以可以直接访问到 结果为10
function aaa(){
var a=10;
};
aaa();
alert(a); //a 为函数aaa()内部变量量即局部变量,所以无法访问到

6.var a=10;
function aaa(){
alert(a);
};
function bbb(){
var a=20;
aaa();
}
bbb(); //结果为10,因为aaa()函数不能访问到bbb()里面的局部变量,所以访问到的是a=10,这个全局变量
解析:js作用域(全局变量,局部变量)内部可以访问外部,但外部的不能访问内部的;

7.function f1(){
    var n=999;
    return function f2(){
      return n;
    }
  }
window.console.log(f1()())//999
在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1就是不可见的。
8for(var i=0;i<5; i++){
setTimeout(function(){
console.log(i,(new Date).toLocaleString())
},1000i);
}
// i的执行结果为 5 5 5 5 5 (for先执行完了 i为5)
// 解释如下: 因为 for循环部分和 setTimeout console.log为同步事件 , funcition(){},1000
i为 异步操作 所以先将异步操作的部分存放到 任务队列中去(task list) 然后 先执行同步操作的部分 再通过 事件轮询(event loop 监听器)读取它的时间 当1000毫秒结束以后,通知主线程将它的异步操作部分拉回去(在主线程的末尾,同步操作完了,再执行它)
// 注: 协程里边是 先进先出 所以i是按顺序执行的
9.function foo(x) {
var tmp = 3;
return function f2(y) {
alert(x + y + (++tmp));
};
}
var bar = foo(3); // bar 现在是一个闭包
bar(10);
首先执行var bar = foo(3);那么foo就执行了,参数3也传进去了,但是执行完毕后,tmp变量以及参数x就已经被释放回收了吗?
并没有,因为返回值里面还等待使用这些变量,所以此时,foo虽然执行了,但是foo的变量并没有被释放,在return中等待继续使用这些变量,这时bar就是一个闭包。
10.function Pig(){
this.age=99;
return ‘abc’;
}
var pig=new Pig();
console.log(pig)//pig对象,因为函数作为构造函数运行时,return的值是忽略的,还是返回对象。

你可能感兴趣的:(十道函数面试题)