JS – 作用域问题
JS – 作用域问题
Table of Contents
- 变量声明和函数声明
function f() { a = 3; // 相当于 window.a = 3 } f(); alert(a); // 3 function f() { var a = 3; } f(); alert(a); // 未定义
var t = 10; function f() { t = 3; } document.write(t); // 3
var t = 10; function f() { var t = 3; } document.write(t); // 10
var a = 3; function f1() { a = 4; function f2() { a = 5; } f2(); } f1(); document.write(a); // 5
var a = 3; function f1() { var a = 4; function f2() { a = 5; } f2(); } f1(); document.write(a); // 3
变量声明和函数声明
对于声明的分析过程: 参数 –> 变量 –> 函数声明
规则 1:
对于变量声明
如果 存在参数 和 声明变量名相同, 不能覆盖 (不会重新声明一个变量), 但是有赋值会覆盖, 另外说, 规则 1 和规则 2 只讨论变量声明
规则 2:
对于函数声明
函数声明可以覆盖变量声明 和 参数
// -- 对于规则 1 function f(a) { var a; // 这里不会声明 alert(a); // 8 } f(8); function f(a) { var a = 2; alert(a); // 2 } f(3);
// -- 对于规则 2 function f() { var a; alert(a); function a() {} alert(a); } f(); // 输出两个 a 函数, 说明原来的 a 声明被函数声明覆盖 function f() { var a = ‘hello‘; // 最后赋值, 函数 a 会被覆盖成 ‘hello‘, 赋值的分析 是在 变量声明和函数声明 分析之后的 alert(a); function a() {} alert(a); } f(); // 输出两个 ‘hello‘ function a(b) { alert(b); // 先赋值 1 b = function () { // 没有函数声明, 直接赋值, 再赋值一个函数 alert(b); } b(); } a(1); // 结果是 1 和一个函数
时间: 2024-10-15 14:11:08