分析一个JS面试题

来源:互联网 发布:可靠性软件招标 编辑:程序博客网 时间:2024/05/17 22:41

 

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

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))

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 人被骗去搞传销怎么办 进了传销想出来怎么办 武汉江夏健康证怎么办 健康证条子掉了怎么办 送外卖的健康证怎么办 美团没有健康证怎么办 健康证不给补办怎么办 南京怎么办健康证去哪里办 浙江横店健康证怎么办 办健康证查乙肝怎么办 餐饮健康证丢了怎么办 办健康证吃了东西怎么办 吃宵夜脸肿了怎么办 晚上不吃宵夜饿了怎么办 办健康证身份证丢了怎么办 宁波二院怎么办健康证 健康证和培训证怎么办 楼下烧煤炉呛人怎么办 衣服染了笔渍怎么办 济宁二院怎么办健康证 刚按揭车的想卖怎么办 房子已过户银行不放贷怎么办 办房贷信用逾期给拒了怎么办 二手房过户了房贷下不来怎么办 没有房证的房子买卖怎么办 老公失踪房产证要他签字怎么办 税务机关对长期欠税怎么办 离婚有贷款的房子怎么办 买房没过户房主反悔怎么办 房子过户卖方爱人去世怎么办 黄浦区学生社会实践护照掉了怎么办 北京医保卡坏了怎么办 去了越南的签证怎么办 护照签证到期还在国外怎么办 办护照预约满了怎么办 未满16岁怎么办护照 办理护照采集指纹录不上怎么办 办理护照时指纹没有怎么办 未满16岁的怎么办护照 身份证照得太丑怎么办 武汉江夏怎么办健康证