放飞自我 LET DREAMS FLY

面试题:作用域

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、没有输出(日志会报错)

函数里,alert 后有b的声明,所有与解析的为undefind,直接alert,因为window下没有声明b 所以报错

 

 

解释的不对请多多指教!

posted on 2015-03-09 14:47  niuben  阅读(299)  评论(0)    收藏  举报

导航