函数的声明方式与变量作用域

1、两种函数声明方式的区别

  • 函数直接声明:这也是用的最多的。
//直接声明函数。
add(3, 5);    //不会报错。因为这种声明方式,js在执行时,会自动把声明放到最前面,虽然js是从上到下执行的。因此,当调用add函数是,js会去后面查找有没有此函数,并把它提前。
//变量作用域:变量声明也是一样的,变量的声明会被自动提前,但赋值操作还是在原来的位置,详见例子。
 function add(m, n) {
        console.log(m+n);
    }
  • 函数表达式声明:
add(3, 5);    //会报错。因为这种声明方式,js会提示找不到add函数。必须把它放到函数后面才可以正常使用。
var add = function (m, n) {
        console.log(m+n);
    };
     add(3, 5);

2、变量作用域

  • 在js中,变量作用域的区分只有2种:函数内(局部变量)和其他都是全局变量。

注意:仅仅针对的是函数,而if、for等都不是函数,所以在if和for中声明的变量也都是全局变量。

//例1:
console.log(sum);   // undefined。
    var num = 5;
    if (num > 3) {
        var sum = 7;
    }
    console.log(sum); //正常输出:7,因为if不是函数,所以sum也是全局变量,所以全局有效。

//例2:
    for (i = 0; i < 10; i++) {
        console.log(i);     //在其他语言中,for循环中的i是局部变量,只能用在for循环内部,即大括号内。而js不同,js中for中的i是全局变量。
    }
    console.log(i);     //因为i是全局变量,所以for循环外部也可以访问i。 注意:输出的是10,而不是9.
  • 关于变量作用域的几个经典案例
//例1:
var num = 10;
fun();      //undefined
function fun() {
    //var num :变量声明会被自动提前,同函数直接声明一样。即相当于在此处声明了num,但赋值操作还是在原来的地方,因此,此时的num没有被赋值,所以输出为undefined。
    console.log(num);
    var num = 20;  //变量声明被自动提前(函数内的前),另外,如果在函数内声明变量时不带var,则这个变量是全局变量。虽然他写在函数内。
}
//为什么没有用外部的num=10?因为,在查找变量时,都是先找局部范围的,如果找不到,再去外面一层范围找。这里:它会先在函数内(大括号)寻找num,所以用不到外面的num。

//例2:
f1();
console.log(c);
    console.log(b);
    console.log(a);     //报错。其他都正常。
    function f1() {
        var a=b=c=0;
         /*这句相当于:var a = 0;  //a带var声明,所以是局部变量。b和c不带var声明,所以是全局变量。
                          b = 0;
                          c = 0;
        */
        console.log(a);
        console.log(b);
        console.log(c);
    }
  • 变量与函数重名的时候,变量生效
    这涉及到了变量和函数的预解析:
    1、变量声明会被顶置,函数声明也会被顶置且比变量更先声明。
    2、变量的声明和赋值语句一起写时,JS引擎在解析时,会将其拆成声明和赋值2部分,声明置顶,赋值保留在原来位置。
    3、声明过的变量不会再重复声明。
var a = 100;
function a() {
    return "function";
}
console.log(a);     //输出 100
console.log(a());   
/*
报错
Uncaught TypeError: a is not a function
    (anonymous function) @test.html:9
*/

*更多可以参考http://www.runoob.com/js/js-variables.html中的笔记部分。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容