1
Sivan 2013-11-26 02:16:49 +08:00 via iPhone
this 容易用错。
|
2
otakustay 2013-11-26 02:18:19 +08:00
函数不是块,在语法中的block是指if/else/for/while语句里2个大括号之间的部分
|
3
xuyiwei 2013-11-26 08:33:58 +08:00
是 花括号 {} 跟 java C# 这些用法不一样
|
5
coffeedeveloper 2013-11-26 09:42:48 +08:00 1
代码说明一切:
``` var a = true; if(a){ var b = 1; } alert(b) //输出1 ``` 正常来说如果有块级作用域的话,```alert(b)```应该是输出```undefined```才对。 |
6
Mutoo 2013-11-26 10:06:52 +08:00
javascript:
for(var i=0;i<10;i++){ console.log(i); //0, 1, ..., 9 } console.log(i); //10 c++: for(int i=0;i<10;i++){ cout<<i<<endl; //0, 1, ..., 9 } cout<<i<<endl; // undeclared variable i |
7
GTim 2013-11-26 10:44:52 +08:00
赞楼上几位
|
8
teddy1004 2013-11-26 11:12:32 +08:00
JavaScript 的作用域不太一样,作用域是被定义时候的作用域,而不是执行时的。
function hello() { for (var i = 0; i < 10; i++) { doSomething... } } console.log(i); 一般的语言上面的语法就是错误的,因为变量 i 应该已经被销毁了。但是 JS 中就是可以的。 |
9
toctan 2013-11-26 11:48:56 +08:00
@teddy1004 这代码明显会报错嘛,由于 JS 的 function scope, i 在函数外不可见,明显会报
`ReferenceError: i is not defined` 其实我觉得楼主是在问什么是 block scope 和 function scope |
10
Ricky123 2013-11-26 11:51:35 +08:00
@coffeedeveloper 好遗憾,回复没有支持Markdown..
|
11
cyberscorpio 2013-11-26 12:01:37 +08:00
后来的标准里面有个 let 关键字支持这个的块级作用域。
我在写 Firefox 扩展的时候已然大量使用了。 |
12
Golevka 2013-11-26 12:49:34 +08:00 2
历史上, JS中的作用域是由activation object/variable object间的引用关系决定的, 所以只有在创建activation object时才会开启一片新的作用域, 这一动作发生在函数被调用时. (其实javascript能实现lexical scope是因为在declare function时先把parent scope给记下来, 这样每次调用函数时都能在正确的位置(F.[[Scope]])创建新的activation object)
到了ES5时lexical env这块标准完全重做了, 用独立的environment record的概念来代替原有的object模拟scope的定义, 但是行为上基本还是兼容旧标准, 比如Block的求值规则几乎没变动; 到ES6这儿Block几乎完全重做了, 在进Block时会创建新的declarative environment, let和const的作用域解析就做在这个地方; var为了兼容旧标准在variable environment做名字解析. (其实到这里var这个东西就应该被干掉了, 或者至少标记为deprecated免得后人踩坑 |
13
yjsslab 2013-11-26 13:22:03 +08:00
用 js 写函数式编程的代码就应该问题不大吧.
|
15
coffeedeveloper 2013-11-26 15:04:45 +08:00
@Ricky123 好吧,其实我也想不懂为什么v2不支持markdown- -!
|
17
FrankFang128 2013-11-27 12:53:00 +08:00
可以结合 hoisting (变量提升)一起理解 http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html
|