论坛首页 Web前端技术论坛

关于js解析执行有趣的事

浏览 13280 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-06-20  
给我的感觉,倒是像 方法内声名的同名变量,覆盖了全局变量,方法内并不认识外部的了。被重新定义了。
var foo = 1;    
function bar() { 
  alert(foo);
if(!foo) {    
var foo = 10;    
}    
  alert(foo);   
}   

var foo = 10;   这个var 去掉,不去掉是关键。
0 请登录后投票
   发表时间:2012-06-20  
noedu 写道
给我的感觉,倒是像 方法内声名的同名变量,覆盖了全局变量,方法内并不认识外部的了。被重新定义了。
var foo = 1;    
function bar() { 
  alert(foo);
if(!foo) {    
var foo = 10;    
}    
  alert(foo);   
}   

var foo = 10;   这个var 去掉,不去掉是关键。
有var的话,相当于在bar内部定义了一个别与全局变量同名的局部变量,如果没有var,相当于直接用的外部的全局变量
0 请登录后投票
   发表时间:2012-06-20  
第一道题很基础,就不说了,第二道题一开始看有点迷糊,习惯上来说基本都是函数用之前就已经定义好,特别是在函数体内定义新的函数。其实第二道题改成以下代码运行一下,大家就很清楚背后发生了什么事情:
var a = 1;
function b(){
a();
a = 10;
return ;
function a(){alert(2);}
}
b();
alert(a);

其实在函数调用b时,b的scope chain中就已经存在一个局部变量 a,其类型为function,而a=10 语句仅仅是将函数b的局部变量a重新赋值。

不知道我的理解是否正确,请大家“找茬”,谢谢!
0 请登录后投票
   发表时间:2012-06-21  
一般js里
用var 声名的 是全局变量
不用var 声名 在 function 内部的为 局部变量
这样好记一点
0 请登录后投票
   发表时间:2012-06-21  
184883463 写道
一般js里
用var 声名的 是全局变量
不用var 声名 在 function 内部的为 局部变量
这样好记一点

不能这么理解,在function内部不用var声明,这属于隐式声明,变量会变为全局变量
0 请登录后投票
   发表时间:2012-06-21  

我觉得简单理解下:

 

第一个例子可以理解为:

var foo = 1;
function bar() {
    var foo; // 此时值为undefined
    if (!foo) { // !foo=true
        foo = 10; // 执行此步,赋值为10
    }  
    alert(foo); // 弹框弹10
}  
bar(); 

 第二个例子可以理解为:

var a = 1;  
function b() {
    var a ; // 作用域内声明总是在最前的
    a = 10; // 赋值了
    return; // return结束了
    a = function() {};
}  
b();  
alert(a); // 这里查找的是外部的a,跟里面声明的没关系
 

 

 
0 请登录后投票
   发表时间:2012-06-21  
真相只有一个,那就是函数声明和函数表达式的区别,详情https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope#Function_constructor_vs._function_declaration_vs._function_expression,大家都知道js中hoisted的概念,可是对于函数中定义的函数真的跟你们想的一样吗?
0 请登录后投票
   发表时间:2012-06-21  
guilipan 写道
真相只有一个,那就是函数声明和函数表达式的区别,详情https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope#Function_constructor_vs._function_declaration_vs._function_expression,大家都知道js中hoisted的概念,可是对于函数中定义的函数真的跟你们想的一样吗?

闭包,呵呵,并非那么简单,要理解这个还是需要花功夫的
0 请登录后投票
   发表时间:2012-06-21  
天朗java 写道
malie0 写道
不明白为什么第二个例子去掉function a() {}就能赋值了,后面那个函数是干吗用的,不是之前已经return了吗?
这个是为什么呢 楼主再给详细解释下呗,谢谢


第二个函数对输出的结果其实没有影响,函数b中的a其实并不会用到全局的变量a,因为函数中已经声明了 function a()

而alert(a)的时候,其实对应的是全局的变量a

0 请登录后投票
   发表时间:2012-06-21  
malie0 写道
不理解,有没有相关知识的书或文章可以参考一下的

可以看一下<高性能javascript>
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics