面试题:作用域

1.

var foo = 1;

function ff () {

    alert(foo);

    var foo = 2;

    alert(foo);

    this.foo = 3;

}

var m1 = ff();

var m2 = new ff();

答案:undefind、2、undefind、2

不解释

2.

var foo = 1;

function ff () {

    alert(foo);

    var foo = 2;

    alert(this.foo);

    this.foo = 3;

}

var m1 = ff();

var m2 = new ff();

答案:

  • undefind:变量预解析
  • 1:ff()没有具体事件处理对象,函数内this就指向Window,公有变量又都是Window的属性,那this.foo = 1了
  • undefind:变量预解析
  • undefind:new ff(),是一个新的对象,this不指向window,指向函数本身了,这样this.foo前面没有声明,那么就需要预解析

3.

var foo = 1;

function ff () {

    alert(foo);

    var foo = 2;

    alert(this.foo);

    this.foo = 3;

}

var m1 = ff();

var m2 = ff();

答案:undefind、1、undefind、3

  最后的答案3:m1的时候,this.foo = 3, 因为this指向的是window,所以已经把var foo = 1,变成3了

-----------------------------------------------------

1.

var a = {'name': 'test'};

function ff(obj){

    obj.name = 'abs'; 

}

ff(a);

alert(a.name);

答案:abs

json是引用类型,所以a作为obj参数传进去,改变它的name属性,外面a的那么也改变

2.

var a = {'name': 'test'};

function ff(obj){

    obj = new Object();

    obj.name = 'abs'; 

}

ff(a);

alert(a.name);

答案:test

new Object()后,obj变成一个全新的对象了,obj.name 和外面的a.name 用的也不是一段内存了!

----------------------------------------------

 下面代码输出结果:

var a = 'holle';

function ff(){

    alert(a+b);

    var b = 'world';

}
ff(); alert(a
+b);

答案:holleundefind、没有输出(日志会报错)

原因:我还不清楚,请帮忙解释一下子

 

解释的不对请多多指教!

你可能感兴趣的:(面试题)