初学js,正在看js高级程序设计,准备把学到的体会心得都写下来。
js比较常见重要的部分:原型+原型链
DOM操作
事件
作用域和闭包
BOM操作
Ajax
准备从这几方面入手看看~(ง •_•)ง
首先js作用域的特性:
局部变量在整个函数体内都是有定义的。
这个意思是局部环境不仅有权访问函数作用域中的变量,也有权访问父环境以及全局环境的变量。感觉很好理解,就是局部的是老大,不管到哪里都可以访问其他环境。
作用域链:看作用域链我感觉最好的办法就是像书上一个列出环境变量的等级
书上的例子:
这里的变量等级:
var color="blue";
function changeColor(){
var anotherColor="red";
fucntion mixColor(){
var tempColor=anotherColor;
anotherColor=color;
color=tempColor; //这里可以访问color和anotherColor和tempColor
}
mixColor(); //这里可以访问color和anotherColor
}
changeColor();//这里可以访问color
window(全局环境)
|----color(变量与函数同级)
|----changeColor()
|---anotherColor(变量与函数同级)
|----mixColor()
|---tempColor
从这个等级上可以看出mixColor()是最小的局部函数,其他两个都是环境都是他的父环境所以他有权访问父环境中的所有变量。且这个顺序是有序的,只能单向向上访问。
即
内部环境可以通过作用域链访问外部环境,但是外部环境不能访问内部环境中的所有变量和函数,就是说每个环境都可以向上搜索作用域
从这个例子中我基本能了解到作用域的作用了,子环境可以访问父环境,但是父环境无权访问子环境中的变量和函数
因为打印的sum是全局环境中的变量,无权访问add里面的局部变量。
所以像这个例子:
function add(num1,num2){
var sum=num1+num2;
return sum;
}
var result=add(10,20); //这里输出的是30
console.log(sum); //这里输出的是undefined
如果这个函数去掉var关键字,那么局部变量就变成了全局变量,与打印中的变量时同等级,那么打印出的就是30了。
另外在看大神的博客详解时碰到过这个的代码:
另外在看大神的博客详解时碰到过这个的代码:
var scope="global";
function t(){
console.log(scope); //这里输出的是undefined
var scope="local"
console.log(scope); //这里输出的是local
}
t();
这个是两段差不多的代码,就是下一段代码少了一个var关键字,少了这个关键字让scope变成了全局变量。var scope="global"; function t(){ console.log(scope); //这里输出的是global scope="local" console.log(scope); //这里输出的是local } t();
看了大神的解释----由于函数作用域的特性,局部变量在整个函数体始终是由定义的,我们可以将变量声明”提前“到函数体顶部,同时变量初始化还在原来位置。感觉这个话的意思是如果函数体外有var 声明且函数体内也有var 声明,那么则可以认为是将变量提前声明到函数体顶部,但同时变量的初始化赋值还是在下一面的位置。---其实还是不太懂。。
然后看了书上的查询标识符,说搜索的环境是从作用域的前端开始,向上逐级查询标识符。就是说搜索的等级是从局部开始,如果局部环境中存在着同名标识符,就不会使用位于父环境中的标识符。
然后我是这样想的:第一段代码里的第一个console.log里的scope标识符因为在局部变量里面找不到所以想向上个环境找,但是由于从局部环境这里,已经发现了一个有scope标识符的局部变量,所以搜索就停止了。所以第二个console.log里的scope由于函数的顺序性找到了变量,而第一个却是undefined(因为第一个前面没有scope的声明所以无法识别)。
这样一来第二个也就好懂了。一个两个变量并不是同一个标识符,所以并不会冲突影响搜索停止。
不知道这样想对不对~希望有人能指导一下O(∩_∩)O