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 所以报错
解释的不对请多多指教!