作用域
概念:变量或函数使用的范围
作用域的划分:js中作用域可以分为全局作用域和局部作用域
全局作用域:script标签以内,函数体以外
局部作用域:函数执行形成局部作用域 (函数体以内)
作用域特点:
全局作用域特点:在全局下定义的变量或函数,称之为全局变量或全局函数,可以在任意地方(全局或局部)访问或修改
局部作用域特点:在局部作用域下定义的变量或函数,称之为局部变量或局部函数,只能在当前作用域下访问或修改
// a,b变量称之为全局变量
var a = 10;
var b = 20;
console.log(a, b); //10 20
// fn全局函数
function fn() {
var c = 1000; //局部变量
console.log(a, b, c);
function fn1() { //局部函数
console.log("哈哈");
}
fn1();
}
fn();
// console.log(c); //ReferenceError: c is not defined
// fn1(); //ReferenceError: fn1 is not defined
// 全局函数
function test() {
console.log(a, b);
// console.log(c); //ReferenceError: c is not defined
fn();
// fn1();//ReferenceError: fn1 is not defined
}
test();
预解析(变量提升)
js中预解析可以分为全局下的预解析和局部下的预解析,预解析就是将所有带有var和function的关键字进行提前的加载,预解析可以分为两部分 声明 和 定义,var是只声明不定义,function是声明+定义
声明:var a;
定义:a= 10; (赋值)
函数执行形成局部作用域,实际上是提供了代码执行的环境,是一个栈区。
![](https://i-blog.csdnimg.cn/blog_migrate/22b911fad9263bfd53e562d77c61491e.png)
作用域链
概念:首先作用域链是一种查找机制,在当前作用域下,用到某个变量或函数,有私有的先用私有的,私有的没有会往上一级作用域进行查找,上一级作用域没有就再往上一级作用域进行查找,直到找到全局作用域为止,找不到就报错了。 (上一级作用域:就看当前这个函数在哪里预解析的 / 在哪里调用的)
函数执行完毕会自动销毁(垃圾回收机制)
![](https://i-blog.csdnimg.cn/blog_migrate/66d676d93ecb3dd9bc98eac9e60a4d6b.png)
函数返回值
在函数外界想要得的函数内部的数据,需要返回给外界,这个返还给外界的值,就称为函数返回值
特点:
当函数没有返回值时,默认为undefined;
return本质是退出当前函数,函数中一旦遇到return,这个函数到这里就结束了,return后面代码就不执行了,我们返回值必须在函数体末尾;
默认我们只能返回单个值,返回多个值我们一般会返回一个数组;
返回值得数据类型:可以是任意数据类型
获取经过浏览器渲染的样式
浏览器渲染的样式:包含了行内样式,内部样式,外部样式
获取:
getComputedStyle(元素).样式属性 或 getComputedStyle(元素)['样式属性'];
注:getComputedStyle在IE8及以下不兼容,IE下提供了独有的获取经过浏览器渲染样式的方式
IE:
元素.currentStyle.样式属性 或 元素.currentStyle['样式属性'];
浏览器渲染兼容处理
/*
作用:获取经过浏览器渲染的样式值
参数:
ele:元素
attr:样式属性 (字符串)
返回值:返回当前属性具体的样式值
*/
function getStyle(ele, attr) {
// 判断
if (ele.currentStyle) { //IE下
// 一旦涉及变量用中括号语法
return ele.currentStyle[attr];
} else { //IE以外其它浏览器
return getComputedStyle(ele)[attr];
}
}