代码来源:http://www.ido321.com/914.html
代码来源:http://dmitry.baranovskiy.com/post/91403200
纯属个人理解,欢迎大神指正、
1.
1 if (!("a" in window)) { 2 3 var a = 1; 4 5 } 6 7 alert(a); //undefined
js中没有块级作用域,所以a会提前声明,"a" in window会得到true,所以并不会对a进行赋值操作
2.
1 var a = 1, 2 3 b = function a(x) { 4 5 x && a(--x); 6 7 }; 8 9 alert(a); //1
先参考如下代码
1 var f = function g(){ 2 alart(g); //弹出g的函数体 3 }; 4 alert(g); //会报错,g is not undefined
g仅在其函数体内起作用。
所以b=function a(x){... }并不会对全局变量a产生影响、
3.
1 function a(x) { 2 3 return x * 2; 4 5 } 6 7 var a; 8 9 alert(a); //弹出函数体
这个好像没有什么悬念,函数声明会先于任何语句之前执行,第七行仅仅重新声明a,但并不会对a做任何改变、
1 var fn = 1; 2 function fn(){ 3 alert("fn"); 4 } 5 alert(fn);// 1
假如重新对fn进行赋值的话,将会改变fn,关于函数声明和函数表达式的内容可以参考汤姆大叔的详细讲解(http://www.cnblogs.com/TomXu/archive/2011/12/29/2290308.html)
4.
1 function b(x,y,a){ 2 arguments[2]=10; 3 alert(a); 4 } 5 b(1,2,3); //10
其实在函数体内,a和arguments[2]都是对同一参数的引用,如下:
1 function fn(v){ 2 alert(arguments[0]===v); 3 } 4 fn(10); //true
但是当传递的参数值为空的时候,如果在函数体内对v或者arguments进行手动修改的话,将会导致不再是对同一对象的引用
1 function fn(v){ 2 //不对v和arguments做任何修改 3 alert(v === arguments[0]); //true 4 5 6 v = 10; 7 alert(v);//10 8 alert(arguments[0]);//undefined 9 alert(arguments[0]===v); //false 10 11 /* 12 arguments[0]=10; 13 alert(arguments[0]);//10 14 alert(v);//undefined 15 alert(arguments[0]===v);//false */ 16 } 17 fn();
5.
1 function a() { 2 3 alert(this); 4 5 } 6 7 a.call(null);
javascript中call的语法为 call(thisObj,arg1,...,argn)
参数thisObj:可选项,将被用作当前对象的对象。
参数arg1,...,argn:可选项,将被传递方法参数序列。
如果没有thisObj为空,则默认使用Global(window)进行调用:
1 function fn(){ 2 alert(this); 3 } 4 fn.call(null);//[object window] 5 fn.call();//[object window] 6 fn.call(undefined);//[object window] 7 fn.call(window);//[object window]
时间: 2024-12-17 11:48:23