JavaScript面试题1

<script>
function Foo() {
    getName = function () { console.log (1); };
    return this;
}
Foo.getName = function () { console.log (2);};
Foo.prototype.getName = function () { console.log (3);};
var getName = function () { console.log (4);};
function getName() { console.log (5);}

//请写出以下输出结果:
Foo.getName(); //2
getName(); //4
Foo().getName(); //1
getName(); //1
new Foo.getName(); //2
new Foo().getName(); //3
new new Foo().getName();  //3
</script>

(1)getname()是Foo对象的静态方法;直接调用;

function People(name){
    var name = name; //私有属性
    this.name = name; //公有属性
    function getName(){ //私有方法
        return name
    } 
}
People.prototype.getName = function(){ // 公有方法
    return this.name;
}

People.age = 18; //静态属性
People.getName = function(){ //静态方法
    return this.age;
}
console.log(People.getName());//18

(2)涉及变量提升
函数声明

function getName() { console.log (5);}

函数表达式

var getName = function () { console.log (4);};

变量及函数声明会变量提升,表达式则不会
经过变量提升后,4输出把5输出覆盖掉了

var getName = undefined;
getName = function (){
    console.log (5);
}
var getName = function () { console.log (4);};

(3)
在这里插入图片描述
函数调用和成员访问一个优先级,所以从左往右
Foo()执行其函数体,将全局的getName()改为输出1,同时返回this=window,然后调用window.getName()输出1
(4)调用全局的getName();已经被改写为输出1.
(5)
new Foo.getName(); new不带参比成员访问优先级低,相当于new (Foo.getName)();
Foo.getName 是function () { console.log (2);}; 即是 new f(){} ();function () { console.log (2);}作为构造函数,输出2
(6)new Foo().getName();
new带参数,成员访问。函数调用同一优先级,从左往右,
new了实例之后调用原型的函数 输出 3
(7)new new Foo().getName();
new带参 ,“." 高于new不带参,相当于
new ((new Foo()).getName)() 输出3;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值