JavaScript中函数声明,函数提升,对象属性和原型属性等问题

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

则:

1. Foo.getNumber();//2
2. getNumber();//4
3. Foo().getNumber();//1
4. getNumber();//1
5. new Foo.getNumber();//2
6. new Foo().getNumber();//3
7. new new Foo().getNumber();//3
分析如下:

(1)第一问,首先定义了Foo函数,该函数为全局变量getNumber(这里的变量)创建了一个getNumber方法。之后又为Foo创建了一个getNumber(这里的是属性)的静态属性并存储了一个匿名函数。

第一问毫无疑问是访问的Foo的静态属性,因此输出2;


(2)第二问,getNumber()方法直接指向window对象,即window对象调用getNumber方法。此时涉及到函数提升的问题。

var getNumber=function(){...}这个为函数表达式,function getNumber(){...}为函数声明,函数声明能提升函数到这一层最上面,所以实际上的执行顺序是:

function getNumber() { console.log (5);}
var getNumber = function () { console.log (4);};
下面的函数表达式覆盖了上面的函数声明,所以此时的getNumber输出4,属于window对象,因此这一问输出4.


(3)第三问,Foo().getNumber(),这里Foo()执行了该函数,返回this,因为这里是window调用Foo,因此Foo()返回的是window,也就是window.getNumber(),因为getNumber前面没有var,所以指向window的getNumber,因此window的getNumber被重新覆盖,调用该方法后输出1;


(4)第四问,这里直接调用了window的getNumber,因为已经被第三问修改,所以这里还是输出1;


(5)‘.’的优先级高于new,因此从左往右执行,因为构造函数Foo.getNumber()没有返回值,因此直接实例化对象,并输出2;


(6)括号的优先级高于new,因此,执行顺序为

(new Foo()).getNumber()

改构造函数返回实例化对象本身,之后调用实例化对象的getNumber函数,因为构造函数并没有为对象添加任何属性,因此到当前对象的原型对象(prototype)中寻找getName,因此输出3;


(7)执行顺序为

new ((new Foo()).getNumber()
先初始化Foo的实例化对象,然后将其原型对象上的getNumber函数作为构造函数再次new



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值