84669 personnes étudient
152542 personnes étudient
20005 personnes étudient
5487 personnes étudient
7821 personnes étudient
359900 personnes étudient
3350 personnes étudient
180660 personnes étudient
48569 personnes étudient
18603 personnes étudient
40936 personnes étudient
1549 personnes étudient
1183 personnes étudient
32909 personnes étudient
js笔试题,回来总结的时候发现有2道题目写错了
(function(x){ delete x; return x; })(1); //1 (function f(){ function f(){return 1;} return f();//2 function f(){return 2;} })();
达达们麻烦解释一下输出结果的来龙去脉。另求授我以渔,每次笔试题遇到此类的题目,都有一些不会做的,归根到底是js底子太薄了,求助,理清上面题目的逻辑需要看js的哪方面知识,谢谢。
小伙看你根骨奇佳,潜力无限,来学PHP伐。
1,这两个都是自执行函数,第一个由于javascript中基本数据类型无法被删除,只能删除对象的属性,所以delete之后对x没有影响,第二个由于函数定义会提升到前面去,也就是这两个f函数在return语句之前被定义,所以后面一个覆盖前面一个,返回22,需要了解自执行函数,delete操作符,变量和函数提升(hoisting)就可以解这道题了吧。可以认真看一遍javascript权威指南,这样基础的东西就差不多都了解啦
(function(){})():自执行匿名函数,声明了一个匿名函数然后立即执行。
第1道题目:
(function(x){ delete x;//false return x; })(1); //1
delete是一元操作符,它用来删除对象属性或者数组元素。然而,并不是所有的属性都可以删除:
一些内置核心和客户端属性不能删除;
通过var语句声明的变量不能删除;
通过function语句定义的函数和函数参数不能删除。
所以,结果输出1
第2道题目:
(function f(){ function f(){return 1;} return f();//2 function f(){return 2;} })();
考察的知识点主要是函数声明提升。js解析器在向执行环境中加载数据时,会率先读取函数声明,并使其在执行任何代码前可用(可以访问)。函数声明提升以后,变成如下代码:
(function f(){ function f(){return 1;} function f(){return 2;} return f(); })();
js中没有函数重载,重名的函数后面的会覆盖前面的,代码相当于这样:
(function f(){ function f(){return 2;} return f(); })();
所以结果输出2
第1题考查js操作符的知识,第2题考查js函数相关的知识,这些基础知识点需要认认真真过一遍书本啊,《JavaScript高级程序设计(第3版)》、《JavaScript权威指南》里面都有详细的讲解,没事多翻翻。基础知识点,首先你得见过,然后多翻多记,没有捷径啊~~~
JS本来设计的就各种坑,记它没什么意义,用个 eslint jslint 之类的就不会出现这么蠢的写法,用 esint 第一个会报error: Deleting local variable in strict mode第二个会报error "f" is already definedes6 都用 let 了,var 都要过时了
这两个都是自执行匿名函数 IIFE (Immediately Invoked Function Expression)格式如下:
(function foo(){ .. })()
建议楼主看下http://benalman.com/news/2010/11/immediately-invoked-function-expression/
delete 操作符的详细解析可以参考:http://www.cnblogs.com/yuzhongwusan/archive/2012/06/14/2549879.html
1、第一道题中的X是参数,函数中的参数相当于在函数内部 var x = 1,即新建一个变量并赋值,而直接用delelte是删除不了变量的;
2、第二道题是要了解函数声明和函数表达式之间的区别,使用函数声明即:
function f(){}
这种方式创建函数,在代码运行之前,会通过函数声明提升的过程,预先读取函数声明;而通过函数表达式即:
var f = function(){}
这种方式创建函数,必须等到解析器执行到函数表达式所在的代码行才能创建函数。
a)题目中的两个函数均是函数声明,因此,代码执行前会预读取两个函数;b)又因为两个函数同名,所以后一个函数会覆盖前一个函数。所以结果是2.
1,这两个都是自执行函数,第一个由于javascript中基本数据类型无法被删除,只能删除对象的属性,所以delete之后对x没有影响,第二个由于函数定义会提升到前面去,也就是这两个f函数在return语句之前被定义,所以后面一个覆盖前面一个,返回2
2,需要了解自执行函数,delete操作符,变量和函数提升(hoisting)就可以解这道题了吧。可以认真看一遍javascript权威指南,这样基础的东西就差不多都了解啦
(function(){})():自执行匿名函数,声明了一个匿名函数然后立即执行。
第1道题目:
delete是一元操作符,它用来删除对象属性或者数组元素。然而,并不是所有的属性都可以删除:
一些内置核心和客户端属性不能删除;
通过var语句声明的变量不能删除;
通过function语句定义的函数和函数参数不能删除。所以,结果输出1
第2道题目:
考察的知识点主要是函数声明提升。
js解析器在向执行环境中加载数据时,会率先读取函数声明,并使其在执行任何代码前可用(可以访问)。函数声明提升以后,变成如下代码:
js中没有函数重载,重名的函数后面的会覆盖前面的,代码相当于这样:
所以结果输出2
第1题考查js操作符的知识,第2题考查js函数相关的知识,这些基础知识点需要认认真真过一遍书本啊,《JavaScript高级程序设计(第3版)》、《JavaScript权威指南》里面都有详细的讲解,没事多翻翻。基础知识点,首先你得见过,然后多翻多记,没有捷径啊~~~
JS本来设计的就各种坑,记它没什么意义,用个 eslint jslint 之类的就不会出现这么蠢的写法,
用 esint 第一个会报
error: Deleting local variable in strict mode
第二个会报
error "f" is already defined
es6 都用 let 了,var 都要过时了
这两个都是自执行匿名函数 IIFE (Immediately Invoked Function Expression)
格式如下:
建议楼主看下
http://benalman.com/news/2010/11/immediately-invoked-function-expression/
delete 操作符的详细解析可以参考:http://www.cnblogs.com/yuzhongwusan/archive/2012/06/14/2549879.html
1、第一道题中的X是参数,函数中的参数相当于在函数内部 var x = 1,即新建一个变量并赋值,
而直接用delelte是删除不了变量的;
2、第二道题是要了解函数声明和函数表达式之间的区别,
使用函数声明即:
这种方式创建函数,在代码运行之前,会通过函数声明提升的过程,预先读取函数声明;
而通过函数表达式即:
这种方式创建函数,必须等到解析器执行到函数表达式所在的代码行才能创建函数。
a)题目中的两个函数均是函数声明,因此,代码执行前会预读取两个函数;
b)又因为两个函数同名,所以后一个函数会覆盖前一个函数。
所以结果是2.