你认为你很了解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]);//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]

 

你可能感兴趣的:(你认为你很了解Javascript?(个人解答))