分析一个JS面试题

 

有点小意思, 分析一下, 一句一句往下看

1. function foo() {
...
}
定义一个foo 的函数对象(函数也是对象), 所以相当于这样
var foo = function() {...

2. foo.prototype.abc = function ... Alisoft

prototype在js中是很有意思的东西, ...(这里省去几千非常非常重要的文字)

总之,上面之后,我们可以这样用:

var a = new foo();
a.abc(); // alert Alisoft

3. foo.abc = function(... Yahoo
foo是一个对象, 所以abc是它的一个属性(成员? 或者其他,反正是东东),
就像
foo.a = 123; 一样, 只是上面 abc的类型是函数(对象)

4. var obj = new foo();
// 重点来啦, 这个会构造一个对象, 然后执行foo函数(我们还米有看), 现在来看

-----> 在开始的函数体内:
(1) foo.abc = function ... Alibaba, 
在上面我们知道, foo.abc 是 function ...Yahoo,
现在被 覆盖 了

(2) this.abc = function ... Alimama
此时的 this就是 new 返回的那个 obj
如果米有这句话, obj.abc 就是 foo.prototype.abc
现在又被 覆盖 了, 所以 obj.abc 就是 Alimama

(3) abc = function ... Alipay
(4) var abc = function ..Taobao
如果米有第(4)句, 将会从外部查找abc, 这意味着形成一个closure,
如果foo是顶层的话,那么 相当于 window.abc = function Alipay

但是有了 var abc = function Taobao,
由于在js中, 变量是函数作用域的(这被称为静态作用域,而在Java C等语言中,有更细的作用域, PHP的作用域也是函数级的)

所以上述实际上是这样:
var abc = function ... Taobao
abc = function Alipay..

很清楚了吧?

5. obj.abc();   是 Alimama 见 (2)
6. foo.abc();  是Alibaba 见(1)
7. abc();  函数未定义,会有js异常(因为 foo内的abc 不是closure变量, 见(4))

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值