作者fillano (冒牌费大公)
看板Ajax
标题Re: [ js ] 全域和区域变数
时间Thu Jun 19 10:43:12 2008
这种问题,最终标准是ECMA262
ECMA262里面用两个东西来定义处理变数的规则:execution context跟scope chain
ECMA262定义了三种execution context: global, eval, function
程式执行进入这三种code,执行环境就会为他建立各自的scope chain,变数解析会
沿着scope chain,从nested的函数由内往外找,最外面就是global
用var可以在任何地方宣告一个变数,宣告在函数内就是函数内的区域变数,宣告在
global就是global变数
没有使用var宣告变数时,执行环境会先在本地找,找不到就沿着scope chain一路找
到了global还没找到时,执行环境就会在global建立这个变数,把他assign为undefined
如果变数右侧又assign一个值,他就不是undefined了,所以接下来使用不会有错误
讯息
以下程式在nested的函数内未宣告,但是在外层的函数宣告了,所以就算没有var,
也不会变成global变数
function test() {
var testme = "test me please.";
function shout() {
testme = "shout: " + testme;
alert(testme);
}
shout();
}
test();
alert(testme);//在ff出现testme is not defined.错误讯息
如果把test()第一行的var拿掉,最後的alert(testme);就不会出现错误
所谓的global与区域,就是这麽回事
不要用其他语言的概念来看javascript,容易产生误会。用三个概念来概括比较
不会出错:
lexcical scope->所以可以做出closure
dynamic type->让你可以用=随便assign
prototype inheritance->用prototype来维护继承(其实用assign就可以,但是不容
易维护)
其实javascript还是一个具备函数语言能力的语言,不多说了。
--
Sapere Aude! 这就是启蒙运动的口号!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 60.250.95.16
1F:推 TonyQ:推 06/19 10:44
2F:推 gpmm:喔喔喔喔!娘子快出来看高手(拜) 06/19 12:54
3F:推 JYHuang:就是那个光~就是那个光~ 06/19 16:12
4F:推 whocant:真神人也~~ 07/30 01:04