也不知道以后会不会再补充
帮人借了本书,正好看了一只没搞明白的作用域一章,写几句
javascript没有C等语言的块作用域,真是个神奇的特性,也就是说{}完全不限制作用域
就我所看到的,只有定义函数才会对变量的作用域有影响
另外还有一个神奇的事情,不多说,直接上例子
var gscope=’hello';
function f(){
alert(gscope);
var gscope;
gscope = ‘world’;
}
f();
以上代码打出的是undefined,因为进入f()以后,gscope已经变成本地的那个变量了
javascript的变量名deference的过程:
解释器维护了一个作用域链,从上往下是全局对象的上下文,然后依次是调用的函数的调用对象(call object)
类似java的call stack顺序
以上的里子就是 f()的cb->全局对象
也就是现在f的cb里找gscope,没找到的话在全局对象里找
不幸的是找到了,而且还是未定义!
这个逻辑打乱了以前的编译语言的思维惯性
在于javascript允许在声明前使用变量,不声明的话默认为全局变量,不管行文顺序,只找作用域链!
(找到最后没找到的话,如果是赋值语句,就加到全局对象的属性中,不然就报错,ms是这样,为考证,摘自javascript权威指南)
之前看了一些python,一直也没搞明白,好像也是有什么作用域链,啥时候有空整整明白