关于函数的面试题一直是前工程师的一个考点!
我们分析一下几个题:
在这里插入代码片
//第一题
var a=10;
function aaa(a){
alert(a);
var a=20;
}
aaa(a);
很简单的一题, 此时打印出来的结果是几,这是一道关于作用域的一道题!
在函数 aaa 的AO 生成时形参和实参的统一,带入的就是GO中 a = 10 的值;所以输出是 10;
在这里插入代码片
第二题
var i = 10;
function fun() {
i = 100;
console.log(i);
for (var i = 0; i < 6; i++) {
console.log(i);
}
console.log(this.i);
console.log(i);
}
fun();
console.log(i);
这题比上题要复杂的多;
首先GO中 i= 10; 和函数体;
这题的坑有两个, 第一个 for 循环的var 关键字会提前, 所以函数中的 那个 i= 100 不会污染全局, 第二个 this 指向的全局
在这里插入代码片
var a = 10;
fun(1,2);
var b = 20;
function fun(m,n) {
console.log(a); //10
// console.log(a + c); //报错
console.log(++a + b++);//NAN
var f;
c = 10;
console.log(a + c++); //21
console.log(m + n); // 3
console.log(m + b); // NAN
console.log(typeof m); //number
}
console.log(c) // 11
这题中的考点 :
1.函数内 没有创建 a 所以调用GO中a 的值;
2.var b = 20 在函数执行的后面 所以只是的 b 赋值是 undefined;
3 。 undefined + number = NAN;
4. 函数中 c= 10 会将c 变为全局变量, 不过需要 执行上下文到这一行 ;
在这里插入代码片
console.log(1 +undefined); //NAN
console.log('1' + +undefined);//1NAN
console.log(1 + +null);//1
console.log('1' + +null);//10
考点 加号 会做一个 隐士转换, 转为number类型!然后undefined转为number类型是NAN , null 是 0;
给大家一些对于这两个值的理解
// undefined:
// (1)变量被声明了,但没有赋值时,就等于undefined。
// (2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。
// (3)对象没有赋值的属性,该属性的值为undefined。
// (4)函数没有返回值时,默认返回undefined。
// null:
// (1) 作为函数的参数,表示该函数的参数不是对象。
// (2) 作为对象原型链的终点。
在这里插入代码片
(function(){
var a = b = 5;
})();
console.log(b);
console.log(a);
这是一个立即执行函数;我们可以将函数内部解释为;
var a = b;
b = 5;
所以 函数执行关闭后 a消失了 而 b 变为了 全局变量
在这里插入代码片
var a = 6;
setTimeout(function () {
alert(a); //66
a = 666;
}, 1000);
a = 66;
这题是定时器的一个考点 里面是一个函数!;
在这里插入代码片
var a = {n:10,m:20};
var b = a;
b.n = 30;
console.log(a == b); //true
console.log(a === b); // true
console.log(a.n); // 30
console.log(b); //object{}
这题 数组和对象都是存放在堆当中;复制的只是地址