JavaScript权威指南__第三章

来源:互联网 发布:javascript初级视频 编辑:程序博客网 时间:2024/04/29 16:26

第三章:类型、值和变量

3.1~3.9lue

3.10:变量作用域

  • JavaScript中在函数内部定义的变量属于局部变量只在函数内部有定义;
  • 函数参数也是局部变量,只在函数内有定义;
  • 在函数体内局域变量的优先级高于同名的全局变量,如果在一个函数内声明一个局部变量或者函数参数中带有的变量和全局变量重名,则全局变量被局部变量覆盖;
var scope = "global"; // 声明一个全局变量function checkscope() {    var scope = "local"; // 声明一个与全局变量同名的局部变量    return scope;}checkscope(); // => "local"
  • 在全局作用域中定义变量时可以不使用var, 但声明局部变量时必须使用var语句:
scope = "global"; // 声明一个全局变量,可以不使用var来声明function checkscope2() {    scope = "local"; // 此处不是声明变量,而是修改了全局变量    myscope = "local"; // 显式的声明一个新的全局变量    return [scope, myscope]; // 返回两个值}checkscope2();  // => ["local", "local"]
  • 当嵌套的定义函数时,会出现局部作用域的嵌套情况:
var scope = "global scope"; // 全局变量function checkscope() {    var scope = "local scope"; // 局部变量    function nested() {        var scope = "nested scope"; // 嵌套作用域内的局部变量        return scope;   // 返回当前作用域内的值    }    return nested();}checkscope(); // => "嵌套作用域"

3.10.1:函数作用域和声明提前

  • 函数作用域:JavaScript中没有块作用域,所以在if代码块或for代码块中声明的变量在整个函数中都有定义,甚至可以在变量声明前就可以使用
function test(o) {    var i = o; // i在整个函数中都有定义    if(typeof i == "object") {        var j = 0; // j在整个函数内都有定义,在j声明之前也可以使用        for(var k=0; k<10; k++) { // k在整个函数内部都有定义,同上;            console.log(k); // 输出0~9        }        console.log(k); // 此处k已经定义,输出10    }    console.log(j); // j已经定义,但可能没有初始化}
  • 声明提前:函数内部声明的变量(包括if代码块和for代码块中)都被“提前”到函数体的顶部
var scope = "global";function f() {    console.log(scope); // 输出undefined,不是“global”,因为下一行什么的scope将全局变量scope覆盖掉,所以此处的scope是下面声明的scope而不是上面的全局变量,但此时该局部变量尚未初始化,所以输出undefined    var scope = "local";// 变量在函数体内部都有定义    console.log(scope); // 输出local}// 以上代码等价于下面的代码function f() {    var scope; // 在函数顶部声明了局部变量    console.log(scope);// 变量存在,但未初始化,其值为“undefined”    scope = "local";    // 此处将其初始化赋值    console.log(scope); // 输出“local”}

3.10.2:作为属性的变量

  • 当声明一个JavaScript全局变量时,实际上是定义了全局对象的一个属性,当使用var声明一个变量时,创建的这个属性是不可匹配的,即该变量无法通过delete运算符删除,如果没有使用严格模式并给一个未声明的变量赋值的话,JavaScript会自动创建一个全局变量,这种方式创建的变量时全局对象的正常的可匹配属性,并可以删除;
var truevar = 1;    // 声明一个不可删除的全局变量fakevar = 2;        // 创建全局变量的一个可删除的属性this.fakevar2 = 3;  // 同时delete truevar;     // => false; 变量不可删除delete fakevar;     // => true;变量被删除delete this.fakevar2;// => true; 变量被删除
  • javascript 中全局变量就是全局对象的属性,可以使用this关键字来引用全局对象;但是却没有办法来引用存放局部变量的对象,这是通过不可见的内部实现的,但这种局部变量对象存在的观念是非常重要的,见下一节.

3.10.3:作用域链

  • 全局变量在程序中始终都有定义的;
  • 局部变量在声明它的函数体内以及其所嵌套的函数内始终是有定义的;

  • 作用域链:将JavaScript代码的全局对象看做一个链表,当加载到全局变量时存放到链表的一个元素中,但加载到一个函数时将该函数加载到链表的一个元素中,在调用某一个变量时,从链表的第一个元素开始查找,如果遇到则使用,如果没有则查找下一个,如果是函数则查找函数中的变量看是否存在;

0 0
原创粉丝点击