<script>
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); }
//请写出以下输出结果:
Foo.getName();//2
getName();//4
Foo().getName();//1
getName();//1
new Foo.getName();//2
new Foo().getName();//3
</script>
Foo.getName()
<script>
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); }
//请写出以下输出结果:
Foo.getName();//2
</script>
这个很简单就是简单的调用问题,找到Foo函数执行里面的getName
getName()
<script>
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); }
//请写出以下输出结果:
getName();//4
</script>
全局上面有两个getName
,首先 变量提升 getName=underfind
然后 function getName(){}
(不执行) 由于这些都存储在栈里面所以先执行function getName()
这里是5然后执行 var getName=function
这里输出4 (var getName=function
会覆盖function getName(){}
)
Foo().getName()
<script>
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); }
//请写出以下输出结果:
Foo().getName();//1
</script>
这里先执行Foo()
函数,Foo
函数里面 return 了this
,这里没有人调用Foo
所以this
指向Window
,注意 :Foo()
里面没有声明而是直接用getName
所以getName
是挂在在window
上面的,这里输出1
getName()
这里的getName
跟上次是不一样的,因为当调用Foo().getName()
这个的时候在window
上面就出现了getName
这个吧之前的getName
都给覆盖了所以输出1
new Foo.getName()
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); }
//请写出以下输出结果:
new Foo.getName();//2
这里有一个js
的优先级 ()
的优先级最大所以应该执行的是 new (Foo.getName)()
执行全局的Foo.getName
输出2
new Foo().getName()
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); }
//请写出以下输出结果:
new Foo().getName();//3
这里有两个运算符()
和.
,()
运算符优先级是最大的所以执行newFoo()
这里的this
就指向他的实例了而不是window
,然后执行实例的getName()
,这里注意Foo
函数里面的getName()
是挂载在window
上面的,而他的实例并没有getName()
,所以去他的原型链去找,也就是执行Foo.prototype.getName = function () { alert(3); };
输出3