标签:style blog io color ar 使用 java sp strong
1、
1 if (!("a" in window)) { 2 var a = 1; 3 } 4 alert(a);
阅读代码:如果window不包含属性a,就声明一个变量a,然后赋值为1,最后弹出这个变量的值。
理解代码:javascript没有块级作用域,所以var a=1;定义的a是全局的,又因为全局的变量都是window的属性(注意没有用var声明的变量也是全局的也是window的属性但是不能被delete);所以执行过程是进不了if内部的,又因为变量什么的提升,其实在执行if(判断语句)的时候,a其实已经存在于执行上下文的变量对象中了,上面的代码相当于:
1 var a; 2 if (!("a" in window)) { 3 a = 1; 4 } 5 alert(a);
再次拟请代码:首先声明a,然后判断a是否在存在(是不是window的属性),如果不存在就赋值为1,很明显a永远在window里存在,这个赋值语句永远不会执行,所以结果是undefined。
2、
1 var a = 1, 2 b = function a(x) { 3 x && a(--x); 4 }; 5 alert(a);
阅读代码:首先定义变量a并赋值为1;然后定义一个函数表达式赋值给b;但是这个函数表达式是个有名函数表达式,在这里不同的浏览器会有不同的解析:在IE里,会将a认为函数声明,所以它被变量初始化覆盖了(后续谈一下变量覆盖问题),就是说如果调用a(--x)的话就会出错(因为a是一个变量),而其它浏览器在允许在函数内部调用a(--x),因为这时候a在函数外面依然是数字,在函数内就是本身的函数声明。上面的代码其实可以完全不看b这个函数表达式,所以以上代码执行的结果为alert出1。
1 var a = 1, 2 b = function(x) { 3 x && b(--x); 4 }; 5 alert(a);
变量覆盖问题:函数声明会覆盖变量声明,但不会覆盖变量赋值(函数声明的优先级高于变量声明的优先级,但如果该变量value赋值了)
1 function value(){ 2 return 1; 3 } 4 var value; 5 alert(typeof value); //"function"
1 function value(){ 2 return 1; 3 } 4 var value = 1; 5 alert(typeof value); //"number"
3、
1 function a(x) { 2 return x * 2; 3 } 4 var a; 5 alert(a);
//就是第二题的函数声明覆盖变量声明
4、
1 function b(x, y, a) { 2 arguments[2] = 10; 3 alert(a);//10; 4 } 5 b(1, 2, 3);
首先理解Arguments对象,他有一下三个属性:
当传入函数的参数小于argument的索引值时,比如你只传入2个参数,而还继续使用arguments[2]赋值的话,就会不一致,
1 function b(x, y, a) { 2 arguments[2] = 10; 3 alert(a);//undefined;
4 alert(arguments[2]);//10; 5 } 6 b(1, 2);
5、
1 function a() { 2 alert(this); 3 } 4 a.call(null);
这道题有几个点:this、call、null;
this--谁调用就指向谁;
call--第一个参数改变this指向;
null--指代的是window。
注意这里的null:根据ECMAScript262规范规定:如果第一个参数传入的对象调用者是null或者undefined的话,call方法将把全局对象(也就是window)作为this的值。所以,不管你什么时候传入null,其this都是全局对象window;
1 function a() { 2 alert(this);//window; 3 } 4 a.call(window);
标签:style blog io color ar 使用 java sp strong
原文地址:http://www.cnblogs.com/cdwp8/p/4067982.html