javascript 变量的作用域:
这是一个至关重要的问题。特别是当我们从别的语言转向javascript时,必须要明白一点,即在javascript中,变量的定义并不是以代码块作为作用域的,而是以函数作为作用域。也就是说变量是在某个函数中定义的,那么她在函数以外的地方是不可见的。而如果函数是定义在if或for这样的代买块中,那么她随处可见。
全局变量:是定义在所有函数只外的变量。相反局部变量则是定义在某个函数中。其中,函数内的代码可以像访问自己的局部变量一样访问全局变量,反之则不可以。
var num = 1; function her(){ var count = 2; num++; return num; } her(); // 2 her(); // 3 count // count is not defined
这里还有一点非常重要,如果我们声明变量时没有使用var语句,该变量就会默认为全局变量:
function her(){ num = 1; } num; // undefined her(); num; // 1
看看发生了什么:在函数被调用之前num是不存在的,该变量num在函数首次被调用的时候创建,并被赋予全局作用域,这会使得我们在函数之外的任何地方去访问它。
注:最好总是使用var语句来声明变量。
可以考虑使用单一‘var模式‘例:
var a, b=1, c=true, d;
这样一来,我们可以在很大程度上减少污染全局变量。\(^o^)/YES!
函数也是数据:
在javascript中,函数其实也是一种数据。也就是说我们可以把函数赋给一个变量。
var her = function(){ return ‘Hello‘ }
这种定义方式通常被叫做‘函数标识记法’。
上面是一个函数表达式。函数表达式可以被命名,称为命名函数表达式:
var f = function her(){ return ‘Hello‘ }
这种方式也是合法的,但我们常常不会用到。(在这里her是函数的名字,而不是变量。IE会错误的创建f, her两个变量)。
这样看起来,命名函数表达式和函数声明并没有神马区别。但她们其实是不同的。两者的差别表现于她们所在的上下文。函数声明只会出现在程序代码里(在一个函数的函数体内,或在程序主体中)。
// 函数声明 function her1(){ return ‘1‘; } // 命名函数表达式 var f = her()2{ return ‘1‘; } alert(typeof her1) // function alert(typeof her2) // function
所以,javascript中的函数也是一种数据类型,只不过她有两种特性:
1. 她们所包含的是代码。
2. 她们是可执行的(可调用的)。
如何向变量那样使用函数?
var her = function(a, b){ return a + b; } var beauty = her; alert(typeof beauty); // function beauty(1, 2); // 3
所以函数的命名规则与变量的命名规则是一样的。<( ̄︶ ̄)>~~~~~~
匿名函数:
我们可以这样定义一个函数:
var f = function her(a){ return a; }
通过这种方式定义的函数常被称为匿名函数(即没有名字的函数),特别是当她不被赋值给变量单独使用的时候。在这种情况下,她有两种优雅的用法:
1. 您可以将匿名函数作为参数传递给其它函数,这样,接受方函数就能利用我们所传递的函数来完成某件事情。
2. 您可以定义某个匿名函数来执行某些一次性任务。
下一回我们详细探讨一下匿名函数的用法 <( ̄︶ ̄)>~~~~~~