首页 > 代码库 > 你认为你很了解Javascript?(个人解答)

你认为你很了解Javascript?(个人解答)

代码来源: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]);//1014                 alert(v);//undefined15                 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]

 

你认为你很了解Javascript?(个人解答)