-
JS有两种作用域:全局作用域和函数作用域:
-
全局定义的变量和函数都在全局作用域中。
var a = 1; function b() {}; var c = function () {}; // 全局作用域中的变量c,这是将函数的地址存到c中 c();
-
在函数中定义的变量和函数都在函数作用域中。
function b() { var d = 2; // 函数作用域中的变量d }; var c = function () { var e = 3; // 函数作用域中的变量e }; -
内部的作用域能访问外部的作用域,反之不行。访问时从内向外依次查找。
var a = 1; function b() { var c = 0; function d() { console.log(a); // 1,函数作用域d中没有,到函数作用域b中找,函数作用域b中没有,到全局作用域中找 }; d(); }; console.log(c); // 报错 ReferenceError: c is not defined,全局作用域无法访问函数作用域b中的变量c -
如果在内部的作用域中访问了外部的变量就会产生闭包。
-
内部作用域访问的是哪个外部变量,取决于函数定义的位置,和调用无关。
var a = 1; function m() { a++; }; function m2() { var a = 3; m(); // 函数m中的a++,加的是全局作用域中的a,因为函数m定义在全局作用域中 console.log(a); // 3 }; m2(); console.log(a); // 2
-
-
作用域内定义的变量、函数声明会提升到作用域顶部。
【练习题】
-
下面代码输出的是什么?
console.log(a, b, c); var a = 1; var b = function() {}; function c() {};答案: undefined undefined [Function: c]
var a; var b; function c() {}; console.log(a, b, c); a = 1; b = function() {}; -
下面代码输出的是什么?
var a = 1, b = 2; function m1() { console.log(a); var a = 3; function m2() { console.log(a, b); }; m2(); }; m1();答案:
undefined
3 2
var a; var b; function m1() { var a; function m2() { console.log(a, b); }; console.log(a); a = 3; m2(); }; a = 1; b = 2; m1(); -
下面代码输出的是什么?(百度)
var a = 1; function m1() { a++; }; function m2() { var a = 2; m1(); console.log(a); }; m2(); console.log(a);答案: 2 2
var a; function m1() { a++; }; function m2() { var a; a = 2; m1(); // 加的是全局作用域中的a console.log(a); }; a = 1; m2(); console.log(a); -
下面代码输出的是什么?
function m1() { console.log(a); }; function m2() { var a = 2; m1(); console.log(a); }; m2(); var a = 1; console.log(a);答案:
undefined
2 1
var a; function m1() { console.log(a); }; function m2() { var a; a = 2; m1(); console.log(a); }; m2(); var a = 1; console.log(a);