长沙java培训
达内长沙芙蓉路中心

18487146383

热门课程

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

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

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培训教你阅读GC日志

spring注入配置文件属性到java类

Java中Vector和ArrayList的区别

达内长沙Java培训详解volatile关键字

选择城市和中心
贵州省

广西省

海南省

扫一扫

了解更多干货