<pre name="code" class="html">
第一道:
function foo(){
foo.abc = function(){alert('Alibaba')}
this.abc = function(){alert('Alimama')}
abc = function(){alert('Alipay')};
var abc = function(){alert('Taobao')}
}
foo.prototype.abc = function(){alert('Alisoft');}
foo.abc = function(){alert('Yahoo');}
var obj = new foo();
obj.abc();
foo.abc();
abc();
我们就直接针对这输出按顺序进行分析,
执行顺序
第二道:1.foo.prototype.abc = function(){alert('Alisoft');} //这样之后,我们就可以用obj.abc();不懂prototype原型的,可以看这个prototype原型继承 2.foo.abc = function(){alert('Yahoo');} //alert yahoo 3.var obj = new foo(); //创建一个foo的实例obj,同时,执行了foo函数,也就是obj.abc() = function(){alert('Alimama')} 4.foo.abc = function(){alert('Alibaba')} //foo.abc是foo类的静态方法,在实例化foo后执行了代码片段foo.abc = function() //覆盖了原来的foo.abc = function(){alert('Yahoo');},所以foo.abc()输出alibaba 5.this.abc = function(){alert('Alimama')} //这句话把function(){alert('Alimama')赋给了obj.abc,所以obj.abc输出alimama 6.abc = function(){alert('Alipay')}; var abc = function(){alert('Taobao')}; //这两句一起分析,如果没有下一句,那么abc是个全局变量,abc输出alipay //但是因为下一句var abc之后,abc的作用域被限制在foo类里,所以外部的abc()会显示未定义.
</pre><pre style="margin-top: 0px; margin-bottom: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; color: rgb(51, 51, 51); font-size: 13px; line-height: 24px; background-color: rgb(255, 255, 255);">
</pre><pre name="code" class="html"><span style="font-size:14px;">f = function() { return true; }; g = function() { return false; }; (function() { if (g() && [] == ![]) { f = function f() { return false; }; function g() { return true; } } })(); alert(f()); // true or false ?</span>
第三题:
<span style="font-size:14px;">var o = { m: function() { return this.length; }, length: 1 }; var m = o.m; alert(m()); // 请问输出什么? 并解释为什么。</span>