吃晚饭,洗个澡,然后继续吧,今天看完这些,明天就能进入面向对象了,后面还有bom,dom,ajax还有好多需要看呢。刚刚真是惭愧,我还以为我看完函数那一章了呢。汗颜^^^
js函数刚开始的时候会对()有些不清楚。这边分享一下:()有两个作用:
1)分隔作用,function func(arg1,arg2){} var a = String(adwad); (1+2)*3
2)执行作用,var acc = func(); 这里就是执行。
(function(){})(); 前面的小括号指的分隔符,最后的小括号指的是立即执行,很优雅的写法。
这在当你碰到在js中window.onload = init;和在body标签中添加 onload = init();是一样的效果。
就是函数调用和引用的区别,可以看有没有小括号。这个小知识点我觉得挺有用的,就写在这了。
5.1 变量的作用范围和生命周期
看一下下面这个有趣的代码:重点是第二个输出为什么是undefined。
<script> var y =1; function getValue(){ document.write("局部变量y="+y+"<br />"); var y = 2; document.write("局部变量y="+y+"<br />"); } document.write("全局变量y="+y+"<br />"); getValue(); document.write("全局变量y="+y+"<br />"); </script> /*输出 全局变量y=1 局部变量y=undefined 局部变量y=2 全局变量y=1 */ //相当于如下代码: <script> var y =1; function getValue(){ var y ; document.write("局部变量y="+y+"<br />"); y = 2; document.write("局部变量y="+y+"<br />"); } document.write("全局变量y="+y+"<br />"); getValue(); document.write("全局变量y="+y+"<br />"); </script> //这就解释了为什么第二个y是undefined,因为javascript变量声明提升,所以最上面的代码在函数内var y = 2;拆分成两句,一句声明语句,移动到函数最上面,然后因为还没有赋值,所以是undefined,不知道这样解释对不对。
5.2 闭包函数(绑定函数)
闭包是一个函数,所以通常也称为闭包函数,当一个函数不在它所处环境(变量作用范围)中被调用,仍能够使用本地变量,这就是闭包函数。
1)作为值从函数返回的函数
function B(){ var temp = "abc"; function A(){ alert("本地变量temp的值:"+temp); } return A; } var myFunc = B(); myFunc(); //输出本地变量temp的值:abc //如果你理解我刚开始讲的小括号的含义的话,这里很容易理解为什么会是abc。
2)利用变量作用范围形成闭包函数
作为参数传递给函数的函数或作为值从函数返回的函数都是闭包函数,但是利用变量作用范围也可以形成闭包函数
var f; function B(){ var temp = "abc"; f = function(){ alert("temp="+temp); } } B(); f(); //输出temp = abc //B()为了个f赋值,f()输出abc
这边还有一些有意思的代码,
<script> //输出都是10,原因是匿名函数中的i已经处于一个闭包环境中,当执行第一个setTimeout之前,for循环已经结束,i=10 for(var i = 0; i<10; i++){ setTimeout(function(){ alert(i); },1000); } //输出是不规律的0-9 for(var i = 0; i<10; i++){ (function(e){ setTimeout(function(){ alert(e); },1000); })(i); } //另一种办法 for(var i = 0; i<10; i++){ setTimeout((function(e){ return function(){ alert(e); }; })(i),1000); } </script>
好了,就这些吧,明天开始面向对象,洗洗玩会游戏去了。。