有趣的5个JS问题
来源:互联网 发布:c语言编译预处理 编辑:程序博客网 时间:2024/05/16 01:39
原论坛文章地址:http://bbs.csdn.net/topics/390300541
if (!("a" in window)) { var a = 1;}alert ("a=="+a); var a = 1, b = function a (x) { x && a (--x); };alert ("a=="+a);function a (x) { return x * 2;}var a;alert ("a=="+a);function b (x, y, a) { arguments[2] = 10; alert ("a=="+a);}b(1, 2, 3); function a () { alert (this);}a.call (null);
答案及解释:(从原文中整理而来)
第一题:首先会解析所有函数,其次是var声明的变量,但是不会赋值。因为javascript没有块的概念。像for(var i in array)这里的i依然是全局变量。因此,这几行的代码执行顺序是:
1.var a;//声明一个变量,但是不会赋值
2.if语句,全局变量相当于window的属性,所以"a" in window为真,取反为假。故不会执行大括号里面的语句。
3.alert(a);//undefined
第二题:用一个var定义多个变量。函数表达式类似于局部变量,不会被全局作用域中访问到。
执行顺序:
1.声明两个变量var a,b;并给他们赋值a=1,b=function a(){...};这里的function a是局部变量,外部无法访问到。因此全局a还是1.
2.alert(a);//1
第三题:js永远是先解析声明式函数,再解析变量。
执行顺序:
1.解析函数a;
2.声明变量var a;因为a此时没有被赋值,所以它还是指向原来的值。即function a;
3.alert(a);//不言而喻。
第四题:在函数内部可以引用一个对象,它是arguments类似数组,但不是数组。它代表了函数实际接收参数的集合。可以通过下标对相应参数进行访问。如果修改此对象某些属性,如arguments[index],则被传进来的第index(如果有的话,下标从0开始)变量的值也会被修改。
执行顺序:
1.声明一个函数b;
2.执行函数b(1,2,3);因为这里arguments[2]与变量a引用的是一个值,所以当arguments[2]改变时,a也随之改变。
第五题:call方法接受多个参数,其作用是借用别人的方法当作自己的方法。这样能保证执行的时候this能够指向自己。call方法的第二个参数到最后一个参数是传给借用过来函数的。第一个参数是借用的对象(scope),如果这个对象为空,那么将会作为全局window对象调用。即函数中的this指向window。
- 有趣的5个JS问题
- 12个有趣的c问题。
- 12个有趣的C语言问题
- 职场中14个有趣的问题
- 15 个有趣的 JS 和 CSS 库
- 15 个有趣的 JS 和 CSS 库
- 15 个有趣的 JS 和 CSS 库
- 15 个有趣的 JS 和 CSS 库
- 15 个有趣的 JS 和 CSS 库
- 5个有趣的 JavaScript 代码片段
- 5个有趣的 JavaScript 代码片段
- 5个有趣的 JavaScript 代码片段
- CSS3中的5个有趣的新技术
- 5个有趣的市场营销妙计
- 有趣的js应用
- 有趣的js时钟
- 有趣的js点灯
- python题目-----python的12个有趣问题
- C++构造函数私有化
- java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor
- extern 和extern "C"
- YII模板(前台显示)详细分析
- mips寄存器
- 有趣的5个JS问题
- extjs+html5
- HTML精确定位:scrollLeft,scrollWidth,clientWidth,offsetWidth之完全详解
- 浅谈微软Surface的跨时代意义
- java 常用数据结构
- ECShop使用心得
- C#文件处理(下载、导出)
- 二维费用 hdu 2159 FATE(完全背包)HDU OJ 4501 小明系列故事——买年货【DP】
- Oracle的SGA与系统vm.nr_hugepages不匹配导致的故障