日期:2014-05-16  浏览次数:20405 次

五段小代码(JavaScript 的核心,闭包和作用域)


if (!("a" in window)) {
 var a = 1; 
}
alert(a);
 

var a = 1,    
b = function a(x) {  
     x && a(--x);   
};
alert(a); 


function a(x) {    
 return x * 2; } 
var a;
alert(a); 


function b(x, y, a) {  
   arguments[2] = 10;  
   alert(a); }
b(1, 2, 3);


 
function a() {   
  alert(this); }
 a.call(null); 



以上五段小代码是什么结果?为何是?

------解决方案--------------------
1,先解析声明后运行,把a是最后为准 输出了 最后一个A函数
2,a赋值1了,输出1
3,var a; 只是声明,运行时略过,还是输出1
4,本来b值是以最后这个,但在2处赋值了新函数,
  所以b = function a(x) { x && a(--x);   } ,我们知道这时a=1,它调用a(--x),所以出错了
5。4出错了后面出没执行了
------解决方案--------------------
楼主,你找不自在
------解决方案--------------------
似乎见到过,好像有人贴过了
------解决方案--------------------
http://bbs.csdn.net/topics/390300541
------解决方案--------------------
if (!("a" in window)) {
 var a = 1; 
}
alert(a); // undefined
  
 
var a = 1,    
b = function a(x) {  
     x && a(--x);   
};
alert(a); //1
 
 
function a(x) {    
 return x * 2; } 
var a;
alert(a); //function a(x) {    return x * 2; }
 
 
function b(x, y, a) {  
   arguments[2] = 10;  
   alert(a); }   //10
b(1, 2, 3);
 
 
  
function a() {   
  alert(this); }  // [Object window]
 a.call(null);
 


我只是实际测试了一下,爱解释的来解释吧
------解决方案--------------------
见过

一:undefined
二:1
三:方法a
四:10
五:window

------解决方案--------------------
不喜欢研究这种题。。。。。。
------解决方案--------------------
第一个函数: a  一定是 window对象的属性之一,没有不是的可能,所以这里的条件是永远不成立的,顾a 的结果是undefined;
第二个函数:a 定义的是全局变量,b是赋值,他把一个函数赋值给b
第三个函数:变量a 虽然是后面var声明的变量,实际上相当于var a = function a(){};
第四个函数:函数体内部的变量执行优先级最高,顾a的值就是 10 ;
第五个函数:call方法是把另一个对象定义的方法,交给该对象来用,call的第一个参数是obj,