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中的笔记部分。