锁定老帖子 主题:关于js解析执行有趣的事
精华帖 (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 去掉,不去掉是关键。 |
|
返回顶楼 | |
发表时间:2012-06-20
noedu 写道 给我的感觉,倒是像 方法内声名的同名变量,覆盖了全局变量,方法内并不认识外部的了。被重新定义了。
有var的话,相当于在bar内部定义了一个别与全局变量同名的局部变量,如果没有var,相当于直接用的外部的全局变量
var foo = 1; function bar() { alert(foo); if(!foo) { var foo = 10; } alert(foo); } var foo = 10; 这个var 去掉,不去掉是关键。 |
|
返回顶楼 | |
发表时间: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重新赋值。 不知道我的理解是否正确,请大家“找茬”,谢谢! |
|
返回顶楼 | |
发表时间:2012-06-21
一般js里
用var 声名的 是全局变量 不用var 声名 在 function 内部的为 局部变量 这样好记一点 |
|
返回顶楼 | |
发表时间:2012-06-21
184883463 写道 一般js里
用var 声名的 是全局变量 不用var 声名 在 function 内部的为 局部变量 这样好记一点 不能这么理解,在function内部不用var声明,这属于隐式声明,变量会变为全局变量 |
|
返回顶楼 | |
发表时间: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,跟里面声明的没关系
|
|
返回顶楼 | |
发表时间:2012-06-21
真相只有一个,那就是函数声明和函数表达式的区别,详情https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope#Function_constructor_vs._function_declaration_vs._function_expression,大家都知道js中hoisted的概念,可是对于函数中定义的函数真的跟你们想的一样吗?
|
|
返回顶楼 | |
发表时间: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的概念,可是对于函数中定义的函数真的跟你们想的一样吗?
闭包,呵呵,并非那么简单,要理解这个还是需要花功夫的 |
|
返回顶楼 | |
发表时间:2012-06-21
天朗java 写道 malie0 写道 不明白为什么第二个例子去掉function a() {}就能赋值了,后面那个函数是干吗用的,不是之前已经return了吗? 这个是为什么呢 楼主再给详细解释下呗,谢谢
第二个函数对输出的结果其实没有影响,函数b中的a其实并不会用到全局的变量a,因为函数中已经声明了 function a() 而alert(a)的时候,其实对应的是全局的变量a |
|
返回顶楼 | |
发表时间:2012-06-21
malie0 写道 不理解,有没有相关知识的书或文章可以参考一下的
可以看一下<高性能javascript> |
|
返回顶楼 | |