考点:
1、变量提升和函数提升
2、this指向
3、变量查找规则及作用域
4、运算符优先级
5、实例对象查找属性(隐式原型链)
例题:
原:
function Foo() {
getName=function () {
alert(1);
return this;
}
}
Foo.getName=function () {
alert(2)
};
Foo.prototype.getName=function () {
alert(3)
};
var getName=function () {
alert(4)
};
function getName() {
alert(5)
}
1、遇到function关键字会将代码整体提升 (函数提升)
2、遇到var关键字声明的变量,会将变量提升,变量值不动 (变量提升)
3、若两者冲突,则只会保留函数的定义
提升后:
function Foo() {
getName=function () { //由于此函数作用域中未声明变量getName,所以去全局作用域中找,所以将下面的getName重赋值
alert(1);
return this;
}
}
//var getName; 和function getName()冲突,省略
/*
function getName() {
alert(5) //下面已经重赋值,可注掉
}
*/
Foo.getName=function () {
alert(2)
};
Foo.prototype.getName=function () {
alert(3)
};
/* getName=function () { //重赋值,上面的function getName注释掉
alert(4)
};*/
getName=function(){
alert(1)
};
输出:
Foo.getName(); // 2
getName(); // 4
Foo().getName(); // (Foo()).getName() 以函数的形式调用,this指向window, 即 window.getName() // 1
getName(); // 1
new Foo.getName(); // new (Foo.getName)() -->new ( function(){alert(2)} )() new会生成一个实例对象,此处并未使用 //2
new Foo().getName(); // (new Foo()).getName() -->foo.getName() new Foo()生成一个实例对象foo,foo的构造函数是Foo,
//foo自身没有getName(),所以会去构造函数中寻找,但是构造函数也没有,就会去构造函数原型寻找 // 3
new new Foo().getName(); //new ((new Foo()).getName)() -->new ( function(){alert(3)} ) () // 3
总结: 1、 . 的优先级最高,先执行,若前面为()如 new Foo() ,则会将前面的先进行运算
2、 new ( function(){alert(2)} )() 执行内部的函数,输出2,并生成一个实例对象
来源:CSDN
作者:七彩毛毛虫
链接:https://blog.csdn.net/SDAW_1/article/details/104267538