变量的作用域
局部变量:定义位置在函数内部用var定义的变量,作用域是在定义的当前函数内部,只对当前函数有作用。
注意:如果在函数的内部不用var定义的变量默认是全局变量。
变量的提升
变量的提升?难道变量也像玩游戏一样,也会打怪升级?!其实不然。
首先,在一个程序内当局部变量和全局变量同名时,是优先使用局部变量的。但是当程序进入新的函数时,他会将所有的变量声明放在函数开始的位置,仅仅会提升变量的声明,而不会提升变量的赋值。这就是传说中变量的提升!
<script type="text/javascript"> var num = 10; function f(){ console.log(num); var num = 20; } f(); </script>
这里就定义了一个同名的局部变量和全局变量,在函数体内打印变量num的值。但是,奇怪的是此时打印出的num值为undefined,很奇怪吧!这就是因为变量的提升而导致的问题,而且还因为局部变量和全局变量同名。所以在一个程序中定义变量,尽量不要出现两个同名的变量。
函数也是一种数据
这个就直接上代码吧。
function fun(){ console.log("hello world"); } var f = fun; f(); fun();
这里就是用变量f保存了函数fun,可以通过变量f直接访问函数fun();此时,f与fun是等价的,结果会两次打印"hello world"。
匿名函数
匿名,匿名,也就是把名字给隐藏了,没有名字的函数。
当匿名函数没有赋值给另一个变量时有两种优雅的用法:
- 直接传递给函数
- 执行某些一次性的代码
function m(mySum,q,w){ return mySum(q,w); } var ret = m(function(a,b){ return a+b; },1,2) console.log(ret);
这里按照程序的执行来说;先是执行打印ret,通过ret去寻找m(function(a, b){return a + b;}, 1, 2);这里的function(a, b){return a + b;}可以看出是一个参数;紧接着又和m(mySum, q, w)匹配起来,执行m(mySum,q,w){return mySum(q,w)};数据1和2通过m方法传递给了q与w;通过mySum(q,w),传递给了a和b;两相结合,可以得出ret的值为3。
即时函数
即时函数也被称为自执行函数,当函数声明之后立即执行;
组成:(匿名函数)(给第一个小括号中的匿名函数传递参数);
第二个小括号表明函数立即执行,并且给函数传参。
代码如下:
(function(str){ console.log(str); })("Hello World")
这里会直接输出"Hello World"字符串。
总结:通过这次学习,也使我认识到了函数的各种不一样的使用方法,又涨见识啦!