码迷,mamicode.com
首页 > Web开发 > 详细

JS -- 作用域问题

时间:2015-08-09 20:31:58      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:

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 和一个函数

JS -- 作用域问题

标签:

原文地址:http://www.cnblogs.com/sunznx/p/4716164.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!