js面试问题
- 以下代码运行结果
var a=1;
setTimeout(function(){
console.log(a);
var a=111;
},0);
a=11;
结果:undefined
- 以下代码运行结果
function foo(){
foo.a=function(){console.log(1)};
this.a=function(){console.log(2)};
a=function(){console.log(3)};
var a=function(){console.log(4)};
}
foo.prototype.a=function(){console.log(5)};
foo.a=function(){console.log(6)};
foo.a();
var obj =new foo();
obj.a();
foo.a();
prototype 属性使您有能力向对象添加属性和方法。
上到下为: 6 ,2 ,1
解析:
js的执行顺序
function foo() {} 定义全局变量foo
foo.a = function(){} 给全局变量foo的a属性赋值
var obj = new foo();构造函数调用foo
进入foo函数:
foo.a=function(){}给全局变量foo的a属性覆盖操作
this.a=function(){}因为用了new关键字 this指向obj所以这句话是obj.a=…
下面两句要一起看
a = function(){}本来这句没有var是默认全局变量
var a = function(){}但是这一句用了var导致变量声明提前所以上面一句的a也变成了局部变量这一句覆盖了a
所以归根结底foo.a只执行了两次操作