javascript快速入门
2015-10-01 21:12
676 查看
这里关于javascript的历史,我就不多说了,想必大家都是知道的,直接进入主题吧。
直接在script标签中书协javascript代码
这里就是直接在script标签中书写的JavaScript代码,window.onload表示当前页面加载完毕执行的代码。
引入外部js文件
同样,我们可以将所有当前页面需要用到的JavaScript代码书写到js文件中,然后在该页面中引入即可。
这里我定义了一个简单的方法,然后调用两次。
这里我写了一个匿名函数,并且传入参数调用了自己,这里注意:
function() {} :相当于返回函数的首地址
(function(){}) : 把这部分看成一个整体
(function(){}) () : 根据返回的首地址,调用该函数。
自调用匿名函数的优点:可以避免代码中的函数有重命名问题,并且以上代码只会执行一次,一般用作初始化工作。
这里可以看出,我们在函数内部定义的变量就是局部的,否则就是全局的,这里的定义是通过var类型来声明的变量。其实在javascript中方法也可以理解是一个类,这里就相当于private和public类型的变量。举个栗子吧:
小结:在js中,如果某一个变量没有var声明,会自动到上一层的作用域中查找该变量的声明语句,如果找到,就使用,如果没有找到,继续向上查找,一直查找到全局作用域位置,如果全局作用域也没有找到,则系统会自动在全局作用域进行声明该变量。这就是js的作用域链。
这里我声明了一个函数,并且调用了该,传入了声明的参数。首先遍历打印每一个参数值。可以发现,系统会自动将传递的所有参数存放到一个arguments的数组里边,这里,我们可以借助该参数实现不确定参数时候的需求。
可以看到,在数组中可以存放任意类型的数据,包括函数,实际上在JavaScript中函数也是对象。
这里我写了三个div,大小不同,从最外层的到最内层的逐渐减小。此时运行效果如下:
可以看到,此时如果点击最内层的div,事件会一次向上传递,那么如何阻止事件继续向最外层传递呢?这里我写了一个方法,该方法兼容ie和w3c,比如在点击了div3之后不希望事件继续向上传递,则只需要在div3的函数运行结束时候,运行该方法即可。
这里通过stopDefault方法来阻止默认的浏览器事件,兼容ie和w3c标准。
这里使用了setInterval(需要调用的方法,间隔时间)。
上面的代码写了一个简单的JavaScript面向对象的栗子,首先声明一个Person类,然后为person对象添加属性,这里需要注意的是,在JavaScript中,我们可以动态的为对象添加任意类型的属性,而不是像java里边,必须先声明好所有的属性。
根据上面的代码可以看出获取对象的属性有两种方式:
对象.属性
对象[“属性”]
但是还是要注意这两个还是有区别的,如果一个属性原本就含有”.”,那么只能使用 对象[“属性”] 这种方式来获取属性的值
我在声明Person类的时候就为两个属性name和age分别使用this指针附上了对应的值.此时p1和p2对象都拥有name和age属性,并且修改了一个另外一个是保护不变的,此时这两个对象之间是互不干扰的。
此时p1和p2对象默认的name和age属性就不同了。
语法如下:
可以访问局部变量
使变量所占的内存不会被释放
先看下面这段代码:
从上面的代码可以看出,变量可以指向一个函数的首地址,并且一个函数也可以返回另一个函数。
下面我将上面的代码改进一下:
可以看到,这里我在fun1函数中增加了一个局部变量num,发现在fun1函数执行完成之后依然可以访问到该局部变量的值。是因为虽然fun1函数执行完成了,但是fun2函数内部引用了局部变量num,因此num是不会被释放的,正好此时test指fun2函数的首地址,因此执行test就是执行fun2
可以发现只要我们使用一个局部函数引用局部变量,此时局部变量的内存就不会被回收,这样就形成了函数闭包。
语法如下:
看下面示例代码:
这里虽然通过var声明的属性我们不能再外部访问了,可是如果该变量我们无法获取和设置其值,又有什么用呢??下面我们来添加一个类似于java当中的get和set方法来解决这个问题。看下面代码:
语法如下:
先看如下代码:
此时由于sayHello方法不属于p1因此p1也就无法调用该方法。
不过我们可以通过如下方式调用sayHello方法:
此时打印出的构造方法如下:
注意这里当不带参数的时候,apply和call的用法是相同的。
下面为sayHello方法加上两个参数:
可以看到,call和apply方法的意义是相同的,不同的是当被调用的参数需要传递参数的时候,参数的传递不同而已。
语法如下:
下面我实现一个简单的student类继承自person类的栗子:
此时运行效果如下:
可以看到student类中并没有sayHello方法,而调用的正是从父类继承过来的。
ok,今天关于JavaScript的学习就到这里了。
在网页中使用JavaScript
在网页中使用javascript有两种方式直接在script标签中书协javascript代码
[code]<script type="text/javascript"> window.onload = function() { alert("write in javascript label"); } </script>
这里就是直接在script标签中书写的JavaScript代码,window.onload表示当前页面加载完毕执行的代码。
引入外部js文件
同样,我们可以将所有当前页面需要用到的JavaScript代码书写到js文件中,然后在该页面中引入即可。
[code]<script type="text/javascript" src="out.js"></script>
javascript函数
在JavaScript中使用函数之前,必须要先定义好函数,才可以调用。函数的定义格式如下:[code]function 函数名(参数) { 函数体 return }
[code]<script type="text/javascript"> function writeHello() { //给页面中输出hello world document.write("hello world"); } writeHello(); writeHello(); </script>
这里我定义了一个简单的方法,然后调用两次。
自调用匿名函数
[code]<script type="text/javascript"> (function(param) { alert("param is :"+param); alert("hello world"); })(22); </script>
这里我写了一个匿名函数,并且传入参数调用了自己,这里注意:
function() {} :相当于返回函数的首地址
(function(){}) : 把这部分看成一个整体
(function(){}) () : 根据返回的首地址,调用该函数。
自调用匿名函数的优点:可以避免代码中的函数有重命名问题,并且以上代码只会执行一次,一般用作初始化工作。
javascript变量作用域
[code]<script type="text/javascript"> first = 22; //全局的 var second = 33; // function sayHello() { var num = 44; //局部的 numglobal = 55; //全局的 } </script>
这里可以看出,我们在函数内部定义的变量就是局部的,否则就是全局的,这里的定义是通过var类型来声明的变量。其实在javascript中方法也可以理解是一个类,这里就相当于private和public类型的变量。举个栗子吧:
[code]<script type="text/javascript"> first = 22; //全局的 var second = 33; // function sayHello() { var first = 44;//这里的first是局部变量,不影响全局变量 second = 55;//这里的second是全局变量,更改了该值,全局second也跟着更改 } sayHello(); alert("first is:"+first+"==second is:"+second); //此时alert的结果first=22,second=55 </script>
小结:在js中,如果某一个变量没有var声明,会自动到上一层的作用域中查找该变量的声明语句,如果找到,就使用,如果没有找到,继续向上查找,一直查找到全局作用域位置,如果全局作用域也没有找到,则系统会自动在全局作用域进行声明该变量。这就是js的作用域链。
JavaScript参数
在javascript中声明的方法是可以带参数的,这里的参数一数组的形式来存放。[code]<script type="text/javascript"> function hello(first,second) { for(var i=0; i< arguments.length;i++) { alert(arguments[i]); } } hello("hello","world"); </script>
这里我声明了一个函数,并且调用了该,传入了声明的参数。首先遍历打印每一个参数值。可以发现,系统会自动将传递的所有参数存放到一个arguments的数组里边,这里,我们可以借助该参数实现不确定参数时候的需求。
JavaScript数组
由于JavaScript是弱类型语言,因此在JavaScript中创建数组的时候,无需指定数组的数据类型,无需指定数组长度,并且可以存储任何类型的数据。创建数组
在JavaScript中创建数组分为如下三种方式:[code]<script type="text/javascript"> var arrayOne = [11,"qq",22.5]; var arrayTwo = new Array("second",function(){alert("second array"),11}); var arrayThree = new Array(2);//表示创建一个数组,长度是2 arrayThree[0] = "hello"; arrayThree[1] = "world"; function printArray(array) { for (var i = 0; i < array.length; i++) { alert(array[i]); }; } printArray(arrayOne); printArray(arrayTwo); printArray(arrayThree); </script>
可以看到,在数组中可以存放任意类型的数据,包括函数,实际上在JavaScript中函数也是对象。
使用for..in语句遍历数组
我们可以使用for循环,和for in语句来遍历数组,这里我只写一个for in的栗子:[code]function printArray(array) { for(var i in arrayOne) { alert(arrayOne[i]); } }
javascript多维数组
[code]<script type="text/javascript"> var arrayOne = [[11,"zhangsan"], [22,"李四"], [30,"王五"] ]; for (var i = 0; i < arrayOne.length; i++) { for(var j in arrayOne[i]) { document.write(arrayOne[i][j]); } document.write("<br/>") }; </script>
JavaScript事件冒泡
先看下面代码:[code]<html> <head> <script type="text/javascript"> window.onload = function() { var divone = document.getElementById("div1"); var divtwo = document.getElementById("div2"); var divthree = document.getElementById("div3"); divone.onclick = function() { alert("div1 click"); } divtwo.onclick = function() { alert("div2 click"); } divthree.onclick = function() { alert("div3 click"); } } </script> </head> <body> <div id="div1" style="width:400px;height:400px;background-color='red'"> <div id="div2" style="width:300px;height:300px;background-color='green'"> <div id="div3" style="width:200px;height:200px;background-color='blue'"></div> </div> </div> </body> </html>
这里我写了三个div,大小不同,从最外层的到最内层的逐渐减小。此时运行效果如下:
可以看到,此时如果点击最内层的div,事件会一次向上传递,那么如何阻止事件继续向最外层传递呢?这里我写了一个方法,该方法兼容ie和w3c,比如在点击了div3之后不希望事件继续向上传递,则只需要在div3的函数运行结束时候,运行该方法即可。
[code]//阻止事件冒泡函数 function stopBubble(e) { if (e && e.stopPropagation) { //W3C e.stopPropagation() } else { //IE window.event.cancelBubble=true; } }
javascript阻止默认事件
[code]<a href="http://www.baidu.com" id="stop">stop default</a> <script type="text/javascript"> //阻止浏览器的默认行为 function stopDefault(e) { if (window.event) { window.event.returnValue = false; } else { e.preventDefault(); } } window.onload = function() { var stop = document.getElementById("stop"); stop.onclick = function(e) { stopDefault(e); alert("it has stop the default behavior"); } } </script>
这里通过stopDefault方法来阻止默认的浏览器事件,兼容ie和w3c标准。
javascript定时器
下面实现一个页面每隔两秒给页面弹出一个hello world[code]<script type="text/javascript"> function printHello() { alert("test"); } setInterval('printHello()',2000); </script>
这里使用了setInterval(需要调用的方法,间隔时间)。
JavaScript面向对象
类的定义
在JavaScript中类的定义格式如下:[code]function 类名() { }
声明对象
[code]var 对象名 = new 类名();
[code] function Person() { } var person = new Person(); person.name = "zhansan"; person.age = 22; person.sex = "man"; alert(person.name+"=="+person.age+"=="+person.sex); alert(person["name"]+"=="+person["age"]+"=="+person["sex"]);
上面的代码写了一个简单的JavaScript面向对象的栗子,首先声明一个Person类,然后为person对象添加属性,这里需要注意的是,在JavaScript中,我们可以动态的为对象添加任意类型的属性,而不是像java里边,必须先声明好所有的属性。
根据上面的代码可以看出获取对象的属性有两种方式:
对象.属性
对象[“属性”]
但是还是要注意这两个还是有区别的,如果一个属性原本就含有”.”,那么只能使用 对象[“属性”] 这种方式来获取属性的值
this关键字
在js中有一个this关键字,表示当前调用的该方法的对象,看下面代码:[code]<script type="text/javascript"> function Person() { this.name = "zhangsan"; this.age = 20; } var p1 = new Person();//此时this表示p1 var p2 = new Person();//此时this表示p2 alert(p1.name+"=="+p1.age); alert(p2["name"]+"=="+p2["age"]); </script>
我在声明Person类的时候就为两个属性name和age分别使用this指针附上了对应的值.此时p1和p2对象都拥有name和age属性,并且修改了一个另外一个是保护不变的,此时这两个对象之间是互不干扰的。
向构造函数传递参数
上面的代码,每次new一个新的person对象的时候,这些对象的name和age属性的值都是一样的,我们可以通过给构造方法传递参数来解决该问题。[code]<script type="text/javascript"> function Person(name,age) { this.name = name; this.age = age; } var p1 = new Person("zhangsan",22); var p2 = new Person("lisi",33); alert(p1.name+"=="+p1.age); alert(p2["name"]+"=="+p2["age"]); </script>
此时p1和p2对象默认的name和age属性就不同了。
使用delete删除对象的属性
可以通过js中的delete关键字来删除某一个对象的属性,看下面代码:[code]<script type="text/javascript"> function Person(name,age) { this.name = name; this.age = age; } var p1 = new Person("zhangsan",22); var p2 = new Person("lisi",33); delete p1.name;//删除p1对象的name属性 alert(p1.name+"=="+p1.age);//打印结果:undefined==22 alert(p2["name"]+"=="+p2["age"]);//打印结果:lisi==33 </script>
javascript静态属性
在java中我们可以使用static关键字来将一个属性描述为类的静态属性,虽然在JavaScript中没有类似的关键字不过我们可以模拟一个静态属性。语法如下:
[code]类名.属性 = 值 //表示当前类的静态属性 类名.属性 = function() { }//表示当前类的静态方法
JavaScript闭包
闭包的功能:可以访问局部变量
使变量所占的内存不会被释放
先看下面这段代码:
[code]<script type="text/javascript"> window.onload = function() { function fun1() { function fun2() { alert("this is alert by fun2"); } return fun2;//在fun1方法中,将内部的fun2方法返回 } var test = fun1();//此时test指向fun2方法的首地址 test();//执行fun2方法,弹出alert("this is alert by fun2"); } </script>
从上面的代码可以看出,变量可以指向一个函数的首地址,并且一个函数也可以返回另一个函数。
下面我将上面的代码改进一下:
[code]window.onload = function() { function fun1() { var num = 22; function fun2() { alert("the local num is :"+num); } return fun2;//在fun1方法中,将内部的fun2方法返回 } var test = fun1();//此时test指向fun2方法的首地址 test();//执行fun2方法,弹出alert("the local num is :22"); }
可以看到,这里我在fun1函数中增加了一个局部变量num,发现在fun1函数执行完成之后依然可以访问到该局部变量的值。是因为虽然fun1函数执行完成了,但是fun2函数内部引用了局部变量num,因此num是不会被释放的,正好此时test指fun2函数的首地址,因此执行test就是执行fun2
可以发现只要我们使用一个局部函数引用局部变量,此时局部变量的内存就不会被回收,这样就形成了函数闭包。
JavaScript模拟私有属性
在JavaScript中不想java那样提供了一个特有的private关键字来指明当前属性是一个私有属性,不过我们可以使用JavaScript特有的属性来模拟出一个类的私有属性。语法如下:
[code]function 类名(arg1,arg2) {//注意这里的arg1,arg2表示形参。 var name = arg1;//此时name是私有属性 this.age = arg2; //此时age是共有属性 }
看下面示例代码:
[code]window.onload = function() { function Person(name,age) { this.name = "zhangsan"; //this指向当前调用该方法的对象,因此p1可以访问到name属性 var age = age; //此时由于age使用var声明,所以是局部变量,因此外部不能访问到 } var p1 = new Person("zhangsan",22); alert(p1.name+"=="+p1.age);//打印结果:zhangsan==undefined }
这里虽然通过var声明的属性我们不能再外部访问了,可是如果该变量我们无法获取和设置其值,又有什么用呢??下面我们来添加一个类似于java当中的get和set方法来解决这个问题。看下面代码:
[code] function Person(name,age) { this.name = "zhangsan"; //this指向当前调用该方法的对象,因此p1可以访问到name属性 var age = age; //此时由于age使用var声明,所以是局部变量,因此外部不能访问到 //通过this为当前调用该方法的对象设置一个getAge方法,用来获得局部变量age的值 this.getAge = function(){ return age; }; //通过this为当前调用该方法的对象设置一个setAge方法,用来设置局部变量age的值 this.setAge = function(a) { age = a; }; } var p1 = new Person("zhangsan",22); //通过getAge方法获得局部变量age的值 alert(p1.name+"=="+p1.getAge());//打印结果:zhangsan==22 p1.setAge(11); //重新为age设置值 alert(p1.getAge()); //打印结果:11
JavaScript中apply和call方法的使用
我们都知道在JavaScript的方法中,如果那个对象调用了该方法,那么内部的this就表示那个对象,我们可以使用apply和call任意方法来指定当前调用的对象。语法如下:
[code]call(那个对象调用,arg1,arg2,arg3,....argN); apply(那个对象调用,[arg1,arg2,arg3,....argN]);
先看如下代码:
[code]window.onload = function() { function Person(name,age) { this.name = "zhangsan"; var age = age; } function sayHello() { alert(this.constructor); //通过打印的constructor判断当前this表示那类对象 alert("hello world"); } var p1 = new Person("zhangsan",22); //p1.sayHello(); 此时不能使用p1调用sayHello方法,因为p1没有改方法。 }
此时由于sayHello方法不属于p1因此p1也就无法调用该方法。
不过我们可以通过如下方式调用sayHello方法:
[code]sayHello.call(p1); sayHello.apply(p1);
此时打印出的构造方法如下:
注意这里当不带参数的时候,apply和call的用法是相同的。
下面为sayHello方法加上两个参数:
[code] function Person(name,age) { this.name = "zhangsan"; var age = age; } function sayHello(hello,world) { alert(this.constructor); //通过打印的constructor判断当前this表示那类对象 alert(hello+"---"+world); } var p1 = new Person("zhangsan",22); //p1.sayHello(); 此时不能使用p1调用sayHello方法,因为p1没有改方法。 sayHello.call(p1,"hello","world"); sayHello.apply(p1,["hello","world"]);
可以看到,call和apply方法的意义是相同的,不同的是当被调用的参数需要传递参数的时候,参数的传递不同而已。
JavaScript继承
在java中,我们可以通过extends关键字来实现继承到指定的类,在JavaScript中并没有给我们提供相应的实现,不过我们可以通过特定的语法来实现JavaScript的继承。语法如下:
[code]子类.prototype = new 父类();
下面我实现一个简单的student类继承自person类的栗子:
[code] function Person(name,age) { this.name = name; this.age = age; this.sayHello = function() { alert(this.name+"==="+this.age); } } function Student(id,name,age) { this.id = id; this.read = function() { alert(this.id+"=="+this.name+"==="+this.age); } } Student.prototype = new Person("zhangsan",11);//表示Student类继承自Person类 var student = new Student(1001); student.read(); student.sayHello();//此时的sayHello是调用从父类中继承的方法
此时运行效果如下:
可以看到student类中并没有sayHello方法,而调用的正是从父类继承过来的。
ok,今天关于JavaScript的学习就到这里了。
相关文章推荐
- jsp版文件上传
- jsp实现新闻内容或超长文章的分页
- jsonkit 分解nsarray 时刻 一个错误
- javascript中判断对象类型
- JavaScript跨域总结与解决办法
- javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈
- js 预加载
- JavaScript之浏览器兼容问题
- javaScript 编程题
- DisJSet:食物链(POJ 1182)
- JavaScript变量
- 理解JavaScript中的闭包
- Extjs 4.2 右键菜单树节点(,选择逆,废除)
- 在HTML中使用JavaScript
- JSP四大作用域
- JSP九大内置对象
- JavaScript parseInt() 函数
- JavaScript高级程序设计之函数表达式之私有变量之增强的模块模式第7.4.3讲笔记
- JavaScript历史简介
- JavaScript高级程序设计之函数表达式之私有变量之模块模式第7.4.2讲笔记