课程咨询 :18487146383

  • JS的功力如何,检验一下吧

    发布:长沙Java培训      来源:techug.com      时间:2016-08-05

  • JavaScript你学的如何呢?来跟达内长沙java培训的老师做几道题目检验一下功力吧。

    第一道题

    var foo = {

    bar: function(){ return this.baz; },

    baz: 1

    }

    typeof (f = foo.bar)();

    答案 “undefined”

    继续改写一下:

    var foo = {

    bar: function(){ return this.baz; },

    baz: 1

    }

    f = foo.bar;

    typeof f();

    把foo.bar存储给f然后调用,所以this在foo.bar引用的是全局对象,所以就没有baz属性了。换句话说,foo.bar执行的时候上下文是foo,但是当 把foo.bar赋值给f的时候,f的上下文环境是window,是没有baz的,所以是 ”undefined”。

    第二道题

    var f = (function f(){ return "1"; }, function g(){ return 2; })();

    typeof f;

    答案 “number”

    逗号操作符的使用可以很混淆,但这段说明它的行为:

    var x = (1, 2, 3);

    x;

    x的值是3,这表明,当你有一系列的组合在一起,并由逗号分隔的表达式,它们从左到右进行计算,但只有最后一个表达式的结果保存。由于同样的原因,这个问题可以改写为减少混乱:

    var f = (function g(){ return 2; })();

    typeof f;

    第三道题

    var x = 1;

    if (function f(){}) {

    x += typeof f;

    }

    x;

    答案 “1undefined”

    这里有个难点,if中的function f(){}要如何处理?函数声明的实际规则如下:

    函数声明只能出现在程序或函数体内。从句法上讲,它们 不能出现在Block(块)({…})中,例如不能出现在if、while或for语句中。因为Block(块) 中只能包含Statement语句, 而不能包含函数声明这样的源元素。另一方面,仔细看一看规则也会发现,唯一可能让表达式出现在Block(块)中情形,就是让它作为表达式语句的一部分。但是,规范明确规定了表达式语句不能以关键字function开头。而这实际上就是说,函数表达式同样也不能出现在Statement语句或Block(块)中(因为Block(块)就是由Statement语句构成的)。

    假设代码我们不妨变一下:

    var x = 1;

    if (function(){}) {

    x += typeof f;

    }

    x;

    var x = 1;

    x += typeof f;

    x;

    f在这了没有被定义,所以typeof f是字符串”undefined” ,字符与数字相加结果也是一个字符串,所以最后的x就是”1undefined”了。

上一篇:这几道JS的题,你会做吗

下一篇:分享:JavaScript自测题

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:7月31日

Java--零基础业余班

Java--零基础业余班

开班日期:7月31日

Java--大数据全日制班

Java--大数据全日制班

开班日期:7月31日

Java--大数据业余制班

Java--大数据业余制班

开班日期:7月31日

  • 网址:http://cs.java.tedu.cn     地址:长沙市开福区芙蓉中路一段 476 号建鸿达现代城 9 楼
  • 课程培训电话:18487146383     全国服务监督电话:400-111-8989
  • 服务邮箱 tousu@tedu.cn
  • 2001-2016 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56