文档库 最新最全的文档下载
当前位置:文档库 › JavaScript高级程序设计(第3版)学习笔记8——函数(中)

JavaScript高级程序设计(第3版)学习笔记8——函数(中)

JavaScript高级程序设计(第3版)学习笔记8——函数(中)
JavaScript高级程序设计(第3版)学习笔记8——函数(中)

接着看函数——这个具有魔幻色彩的对象。在上篇文章中说函数内部属性时,还遗留了一个this内部属性没有解释,不过在说this之前,我想先说一说执行环境和作用域的概念。

6、执行环境和作用域

(1)执行环境(execution context):所有的JavaScript代码都运行在一个执行环境中,当控制权转移至JavaScript的可执行代码时,就进入了一个执行环境。活动的执行环境从逻辑上形成了一个栈,全局执行环境永远是这个栈的栈底元素,栈顶元素就是当前正在运行的执行环境。每一个函数都有自己的执行环境,当执行流进入一个函数时,会将这个函数的执行环境压入栈顶,函数执行完之后再将这个执行环境弹出,控制权返回给之前的执行环境。

(2)变量对象(variable object):每一个执行环境都有一个与之对应的变量对象,执行环境中定义的所有变量和函数就是保存在这个变量对象中。这个变量对象是后台实现中的一个对象,我们无法在代码中访问,但是这有助于我们理解执行环境和作用域相关概念。

(3)作用域链(scope chain):当代码在一个执行环境中运行时,会创建由变量对象组成的一个作用域链。https://www.wendangku.net/doc/6014378853.html,这个链的前端,就是当前代码所在环境的变量对象,链的最末端,就是全局环境的变量对象。在一个执行环境中解析标识符时,会在当前执行环境相应的变量对象中搜索,找到就返回,没有找到就沿着作用域链一级一级往上搜索直至全局环境的变量对象,如果一直未找到,就抛出引用异常。

(4)活动对象(activation object):如果一个执行环境是函数执行环境,也将变量对象称为活动对象。活动对象在最开始只包含一个变量,即arguments对象(这个对象在全局环境的变量对象中不存在)。

这四个概念虽然有些抽象,但还是比较自然的,可以结合《JavaScript高级程序设计(第3版)》中的一个例子来细细体会一下:

// 进入到全局作用域,创建全局变量对象

var color = "blue";

function changeColor(){

// 进入到changeColor作用域,创建changeColor相应变量对象

var anotherColor = "red";

function swapColors(color1, color2){

// 进入到swapColors作用域,创建swapColors相应变量对象

var tempColor = anotherColor;

anotherColor = color;

color = tempColor;

/*

* swapColors作用域内可以访问的对象有:

* 全局变量对象的color,changeColor

* changeColor函数相应变量对象的anotherColor、swapColors

* swapColors函数相应变量对象的tempColor

*/

}

swapColors('white');

/*

* changeColor作用域内可以访问的对象有:

* 全局变量对象的color,changeColor

* changeColor函数相应变量对象的anotherColor、swapColors

*/

}

https://www.wendangku.net/doc/6014378853.html,

changeColor();

/*

* 全局作用域内可以访问的对象有:

* 全局变量对象的color,changeColor

*/

这里的整个过程是:

(1)进入全局环境,创建全局变量对象,将全局环境压入栈顶(这里也是栈底)。根据前面的关于声明提升的结论,这里创建全局变量对象可能的一个过程是,先创建全局变量对象,然后处理函数声明设置属性changeColor为相应函数,再处理变量声明设置属性color为undefined。(2)执行全局环境中的代码。先执行color变量初始化,赋值为'blue',再调用changeColor()函数。

(3)调用changeColor()函数,进入到changeColor函数执行环境,创建这个环境相应的变量对象(也就是活动对象),将这个环境压入栈顶。创建活动对象可能的一个过程是,先创建活动对象,处理内部函数声明设置属性swapColors为相应函数,处理函数参数创建活动对象的属性arguments对象,处理内部变量声明设置属性anotherColor为undefined。

(4)执行changeColor()函数代码。先执行anotherColor初始化为'red',再调用swapColors()函数。

(5)调用swapColors()函数,进入到swapColors函数执行环境,创建相应的变量对象(活动对象),将swapColors执行环境压入栈顶。这里创建活动对象可能的一个过程是,先创建活动对象,处理函数参数,将形式参数作为活动对象的属性并赋值为undefined,创建活动对象的属性arguments对象,并根据实际参数初始化形式参数和arguments对应的值和属性(将属性color1和arguments[0]初始化为'white',由于没有第二个实际参数,所以color2的值为undefined,而arguments的长度只为1了),处理完函数参数之后,再处理函数内部变量声明,将tempColor作为活动对象的属性并赋值为undefined。

(6)执行swapColors()函数代码。先给tempColor初始化赋值,然后实现值交换功能(这里color和anotherColor的值都是沿着作用域链才读取到的)。

(7)swapColors()函数代码执行完之后,返回undefined,将相应的执行环境弹出栈并销毁(注意,这里会销毁执行环境,但是执行环境相应的活动对象并不一定会被销毁),当前执行环境恢复成changeColor()函数的执行环境。随着swapColor()函数执行完并返回,changeColor()也就执行完了,同样返回undefined,并将changeColor()函数的执行环境弹出栈并销毁,当前执行环境恢复成全局环境。整个处理过程结束,全局环境直至页面退出再销毁。

作用域链也解释了为什么函数可以在内部递归调用自身:函数名是函数定义所在执行环境相应变量对象的一个属性,然后在函数内部执行环境中,就可以沿着作用域链向外上溯一层访问函数名执行的函数对象了。如果在函数内部将函数名指向了一个新函数,递归调用时就会不正确了:

function fn(num){

if(1 == num){

return 1;

}else{

fn = function(){

return 0;

};

return num * fn(num - 1);

}

}

https://www.wendangku.net/doc/6014378853.html,(fn(5));//0

关于作用域和声明提升,再看一个例子:

1var name = 'linjisong';

2function fn(){

3 https://www.wendangku.net/doc/6014378853.html,(name);//undefined

4var name = 'oulinhai';

5 https://www.wendangku.net/doc/6014378853.html,(name);//oulinhai

6}

7fn();

8 https://www.wendangku.net/doc/6014378853.html,(name);//linjisong

这里最不直观的可能是第3行输出undefined,因为在全局中已经定义过name了,不过

按照上面解析的步骤去解析一次,就可以得出正确的结果了。另外强调一下,在ECMAScript

中只有全局执行环境和函数执行环境,相应的也只有全局作用域和函数作用域,没有块作用域——虽然有块语句。

function fn(){

var fnScope = 'a';

{

var blockScope = 'b';

blockScope += fnScope;

}

https://www.wendangku.net/doc/6014378853.html,(blockScope);//没有块作用域,所以可以在整个函数作用域内访问blockScope https://www.wendangku.net/doc/6014378853.html,(fnScope);

}

fn();//ba,a

https://www.wendangku.net/doc/6014378853.html,(blockScope);//ReferenceError,函数作用域外,不能访问内部定义的变量https://www.wendangku.net/doc/6014378853.html,(fnScope);//ReferenceError

插了一段较为抽象的概念,希望不至于影响整个阅读的流畅,事实上,我在这里还悄悄的绕

过了一个称为“闭包”的概念,关于函数与闭包,在下篇文章中再详细叙述。

7、函数内部对象与this

对于面向对象语言的使用者来说,this实在是再熟悉不过了,不就是指向构造函数新创建

的对象吗!不过,在ECMAScript中,且别掉以轻心,事情没有那么简单,虽然在使用new操

作符调用函数的情况下,this也的确是指向新创建的对象,但这只是指定this对象值的一种方

式而已,还有更多的方式可以指定this对象的值,换句话说,this是动态的,是可以由我们自

己自由指定的。

(1)全局环境中的this

在全局环境中,this指向全局对象本身,在浏览器中也就是window,这里也可以把全局环境中的this理解为全局执行环境相应的变量对象,在全局环境中定义的变量和函数都是这个变量对象的属性:

var vo = 'a';

vo2 = 'b';

function fn(){

return 'fn';

}

https://www.wendangku.net/doc/6014378853.html,(this === window);//true

https://www.wendangku.net/doc/6014378853.html,(this.vo);//a

https://www.wendangku.net/doc/6014378853.html,(this.vo2);//b

https://www.wendangku.net/doc/6014378853.html,(this.fn());//fn

如果在自定义函数中要引用全局对象,虽然可以直接使用window,但更好的方式则是将全局对象作为参数传入函数,这是在JS库中非常通用的一种方式:

(function(global){

https://www.wendangku.net/doc/6014378853.html,(global === window);//在内部可以使用global代替window了

})(this);

这种方式兼容性更好(ECMAScript的实现中全局对象未必都是window),在压缩时,也可以将global简化为g,而不用使用window了。

(2)函数内部属性this

在函数环境中,this是一个内部属性对象,可以理解成函数对应的活动对象的一个属性,而这个内部属性的值是动态的。那this值是怎么动态确定的呢?

使用new调用时,函数也称为构造函数,这个时候函数内部的this被指定为新创建的对象。

function fn(){

var name = 'oulinhai';//函数对应的活动对象的属性

https://www.wendangku.net/doc/6014378853.html, = 'linjisong';//当使用new调用函数时,将this指定为新创建对象,也就是给新创建对象添加属性

}

var person = new fn();

https://www.wendangku.net/doc/6014378853.html,(https://www.wendangku.net/doc/6014378853.html,);//linjisong

需要注意区分一下函数执行环境中定义的属性(也即活动对象的属性)和this对象的属性。

?作为一般函数调用时,this指向全局对象。

?作为对象的方法调用时,this指向调用这个方法的对象。

看下面的例子:

var name = 'oulinhai';

var person = {

name:'linjisong',

getName:function(){

return https://www.wendangku.net/doc/6014378853.html,;

}

};

https://www.wendangku.net/doc/6014378853.html,(person.getName());//linjisong

var getName = person.getName;

https://www.wendangku.net/doc/6014378853.html,(getName());//oulinhai

这里函数对象本身是匿名的,是作为person对象的一个属性,当作为对象属性调用时,this 指向了对象,当把这个函数赋给另一个函数然后调用时,是作为一般函数调用的,this指向了全局对象。这个例子充分说明了“函数作为对象的方法调用时内部属性this指向这个调用对象,函数作为一般函数调用时内部属性this指向全局对象”,也说明了this的指定是动态的,是在调用时指定的,而不管函数是单独定义的还是作为对象方法定义的。也正是因为函数作为对象的方法调用时this指向这个调用对象,所以在函数内部返回this时才能够延续调用对象的下一个方法——也就是链式操作(jQuery的一大特色)。

?使用apply()、call()或bind()调用函数时,this指向第一个参数对象。如果没有传入参数或传入的是null和undefined,this指向全局对象(在ES5的严格模式下会设为null)。如果传入的第一个参数是一个简单类型,会将this设置为相应的简单类型包装对象。

var name = 'linjisong';

function fn(){

return https://www.wendangku.net/doc/6014378853.html,;

}

var person = {

name:'oulinhai',

getName:fn

};

var person2 = {name:'hujinxing'};

var person3 = {name:'huanglanxue'};

https://www.wendangku.net/doc/6014378853.html,(fn());//linjisong,一般函数调用,内部属性this指向全局对象,因此

https://www.wendangku.net/doc/6014378853.html,返回linjisong

https://www.wendangku.net/doc/6014378853.html,(person.getName());//oulinhai,作为对象方法调用,this指向这个对象,因此这里返回https://www.wendangku.net/doc/6014378853.html,

https://www.wendangku.net/doc/6014378853.html,(fn.apply(person2));//hujinxing,使用apply、call或bind调用函数,执行传入的第一个参数对象,因此返回https://www.wendangku.net/doc/6014378853.html,

https://www.wendangku.net/doc/6014378853.html,(fn.call(person2));//hujinxing

var newFn = fn.bind(person3);//ES5中新增方法,会创建一个新函数实例返回,内部this值被指定为传入的参数对象

https://www.wendangku.net/doc/6014378853.html,(newFn());//huanglanxue

上面示例中列出的都是一些常见情况,没有列出第一个参数为null或undefined的情况,有兴趣的朋友可以自行测试。关于this值的确定,在原书中还有一个例子:

var name = 'The Window';

var object = {

name : 'My Object',

getName:function(){

return https://www.wendangku.net/doc/6014378853.html,;

}

};

https://www.wendangku.net/doc/6014378853.html,(object.getName());//My Object

https://www.wendangku.net/doc/6014378853.html,((object.getName)());//My Object

https://www.wendangku.net/doc/6014378853.html,((object.getName = object.getName)());//The Window

第1个是正常输出,第2个(object.getName)与object.getName的效果是相同的,而第3个(object.getName=object.getName)最终返回的是函数对象本身,也就是说第3个会作为一般函数来调用。

8、函数属性和方法

函数是一个对象,因此也可以有自己的属性和方法。不过函数属性和方法与函数内部属性很容易混淆,既然容易混淆,就把它们放一起对照着看,就好比一对双胞胎,不对照着看,不熟悉的人是区分不了的。

先从概念上来区分一下:

(1)函数内部属性:可以理解为函数相应的活动对象的属性,是只能从函数体内部访问的属性,函数每一次被调用,都会被重新指定,具有动态性。

(2)函数属性和方法:这是函数作为对象所具有的特性,只要函数一定义,函数对象就被创建,相应的属性和方法就可以访问,并且除非你在代码中明确赋为另一个值,否则它们的值不会改变,因而具有静态性。有一个例外属性caller,表示调用当前函数的函数,也是在函数被调用时动态指定,在《JavaScript高级程序设计(第3版)》中也因此将caller属性和函数内部属性arguments、this一起讲解,事实上,在ES5的严格模式下,不能对具有动态特性的函数属性caller赋值。

光从概念上区分是非常抽象的,也不是那么容易理解,再把这些属性列在一起比较一下:

函数属性和方法,除了从Object继承而来的属性和方法,也包括函数本身特有的属性和方法,用的最多的方法自然就是上一小节说的apply()、call(),这两个方法都是用来设置函数内部属性this从而扩展函数作用域的,只不过apply()扩展函数作用域时是以(类)数组方式接受函数的参数,而call()扩展函数作用域时需要将函数参数一一列举出来传递,看下面的例子:

function sum(){

var total = 0,

l = arguments.length ;

for(; l; l--){

total += arguments[l-1];

}

return total;

}

https://www.wendangku.net/doc/6014378853.html,(sum.apply(null,[1,2,3,4]));//10

https://www.wendangku.net/doc/6014378853.html,(sum.call(null,1,2,3,4));//10

不过需要强调的是:apply和call的主要作用还是在于扩展函数作用域。apply和call在扩展作用域时会马上调用函数,这使得应用中有了很大限制,因此在ES5中新增加了一个bind()函数,这个函数也用于扩展作用域,但是可以不用马上执行函数,它返回一个函数实例,将传入给它的第一个参数作为原函数的作用域。它的一个可能的实现如下:

function bind(scope){

var that = this;

return function(){

that.apply(scope, arguments);

}

}

Function.prototype.bind = bind;

这里涉及了一个闭包的概念,明天再继续。

javascript 内置函数和对象

实验项目三内置函数和对象 【学时数】 2 (45 分钟× 2=90 分钟) 【实验内容】 1 、JavaScript 内置函数的应用 2 、JavaScript 内置对象的应用 【实验参考】 《网页设计与制作》………………………………………………………… 重庆大学出版社 《网页标题制作技巧与实例》……………………………………………… 清华大学出版社 《javascript 入门与提高》……………………………………………… 清华大学出版社 《javascript 宝典》……………………………………………………… 电子工业出版社 【实验设备】 计算机,投影机 【实验目的与要求】 1 、掌握JavaScript 内置函数的使用方法 2 、掌握JavaScript 常用内置对象的属性和方法 【实验重点】 1 、掌握JavaScript 内置函数的使用方法 2 、掌握JavaScript 常用内置对象的属性和方法 【实验难点】 1 、掌握使用浏览器对象提供的信息来完成一定功能的网页设计。 【实验方式】 1 、项目工程互动式教学法 2 、“讲、学、练”相结合:对于javascript 内置函数和对象相关细节,大量采用演示、讲解和操作等方式。使学生在实验中加深对相关内容的理解并熟练掌握。 【实验设计】 向学生演示多个javascrip 内置函数和对象的程序案例,学生跟着教师一起完成javascript 程序的编写,同时完成教师布置的思考题,教师实施指导。 第一步:演示JavaScript 内置函数的应用,学生按照教师的操作步骤,自己动手编写该程序,并完成教师布置的思考题。(20 分钟左右)第二步:演示JavaScript 常用内置对象的应用,学生按照教师的操作步骤,自己动手编写该程序,并完成教师布置的思考题。(35 分钟左右) 【实验过程】 实验内容一:JavaScript 内置函数的应用

理解JavaScript中函数的使用

理解JavaScript中函数的使用 函数是进行模块化程序设计的基础,编写复杂的Ajax应用程序,必须对函数有更深入的了解。 JavaScript中的函数不同于其他的语言,每个函数都是作为一个对象被维护和运行的。通过函数对象的性质,可以很方便的将一个函数赋值给一个变量或者将函数作为参数传递。在继续讲述之前,先看一下函数的使用语法: function func1(…){…} var func2=function(…){…}; var func3=function func4(…){…}; var func5=new Function(); 这些都是声明函数的正确语法。它们和其他语言中常见的函数或之前介绍的函数定义方式有着很大的区别。那么在JavaScript中为什么能这么写?它所遵循的语法是什么呢?下面将介绍这些内容。 认识函数对象(Function Object) 可以用function关键字定义一个函数,并为每个函数指定一个函数名,通过函数名来进行调用。在JavaScript解释执行时,函数都是被维护为一个对象,这就是要介绍的函数对象(Function Object)。 函数对象与其他用户所定义的对象有着本质的区别,这一类对象被称之为内部对象,例如日期对象(Date)、数组对象(Array)、字符串对象(String)都属于内部对象。这些内置对象的构造器是由JavaScript本身所定义的:通过执行new Array()这样的语句返回一个对象,JavaScript内部有一套机制来初始化返回的对象,而不是由用户来指定对象的构造方式。 在JavaScript中,函数对象对应的类型是Function,正如数组对象对应的类型是Array,日期对象对应的类型是Date一样,可以通过new Function()来创建一个函数对象,也可以通过function关键字来创建一个对象。为了便于理解,我们比较函数对象的创建和数组对象的创建。先看数组对象:下面两行代码都是创建一个数组对象myArray: var myArray=[]; //等价于 var myArray=new Array();

Javascript自执行匿名函数(function { }) 的原理浅析

Javascript自执行匿名函数(function { }) 的原理浅析 匿名函数就是没有函数名的函数。这篇文章主要介绍了Javascript自执行匿名函数(function { }) 的原理浅析的相关资料,需要的朋友可以参考下 函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途。匿名函数指没有指定函数名或指针的函数,自执行匿名函数只是其中一种,下文中称这种函数为:自执行函数 下面是一个最常见的自执行函数: // 传统匿名函数 (function { alert('hello'); }) ; 这段代码的执行效果就是在页面再载入时弹出:"hello" 是什么促使它自动执行的?,来看下面的代码 // 在传统写法上去掉小括号,并在前面加上运算符~,!,+,- ~function { alert('hello'); } ;

!function { alert('hello'); } ; +function { alert('hello'); } ; -function { alert('hello'); } ; 这些写法与上文所说的传统方式执行起来并无区别, 我发现,这些写法的共同点是运算符,其实传统方式的小括号也属于运算的一种,出现在:a=b*(c+d),运算符 + 传递给自生的参数 = 函数自动执行?但有些符号也不支持,比如“=,*,/”号,它自执行的原因还是很神秘,网上也找不到像样的答案 然后我发现了一个神奇的现象,这些运算符可以无限叠加。。。。。。 // function前面是特定符号可以无限叠加... ~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+ -+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+ -~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-

实验项目21—JAVASCRIPT内置函数和对象

实验难点 实验内容实验目的 实验重点实验步骤 实验内容 1、JavaScript 内置函数的应用 2、JavaScript 内置对象的应用 3、JavaScript 浏览器对象的应用

实验难点实验内容实验目的实验重点实验步骤 实验目的 1、掌握JavaScript 内置函数的使用方法 2、掌握JavaScript 常用内置对象的属性和方法 3、掌握JavaScript 浏览器对象的含义 4、掌握使用浏览器对象提供的信息来完成一定功能的网页设计。

实验难点 实验内容实验目的实验重点实验步骤 实验重点 1、掌握JavaScript 内置函数的使用方法 2、掌握JavaScript 常用内置对象的属性和方法 3、掌握JavaScript 浏览器对象的含义

实验难点 实验内容实验目的实验重点 实验步骤 实验难点 1、掌握使用浏览器对象提供的信息来完成一定功能的网页设计。

实验难点 实验内容 实验目的 实验重点 实验步骤实验内容一:JavaScript 内置函数的应用 1、eval( ):计算字符串表达式的值 2、parseFloat( )和parseInt( ):将字符串开头的整数或浮点数分解出来,转换为整数或浮点数 3、isNaN( ):确定一个变量是否为NaN (Not a Number ) 4、escape( ):将字符串中的非字母数字字符转换为按格式%XX 表示的数字 5、unescape( ):将字符串格式为%XX 的数字转换为字符 6、程序案例1_1:求用户在提示对话框中输入的表达式的值。 7、思考题: 判断用户输入的字符是不是数字,如果是,分别将其转换成浮点数和整数,并显示到网页上。

javascript函数库(全)

转载请注明出处-中国设计秀https://www.wendangku.net/doc/6014378853.html, /* -------------- 函数检索-------------- trim函数: trim() lTrim() rTrim() 校验字符串是否为空: checkIsNotEmpty(str) 校验字符串是否为整型: checkIsInteger(str) 校验整型最小值: checkIntegerMinValue(str,val) 校验整型最大值: checkIntegerMaxValue(str,val) 校验整型是否为非负数: isNotNegativeInteger(str) 校验字符串是否为浮点型: checkIsDouble(str) 校验浮点型最小值: checkDoubleMinValue(str,val) 校验浮点型最大值: checkDoubleMaxValue(str,val) 校验浮点型是否为非负数: isNotNegativeDouble(str) 校验字符串是否为日期型: checkIsValidDate(str) 校验两个日期的先后: checkDateEarlier(strStart,strEnd) 校验字符串是否为email型: checkEmail(str) 校验字符串是否为中文: checkIsChinese(str) 计算字符串的长度,一个汉字两个字符: realLength() 校验字符串是否符合自定义正则表达式: checkMask(str,pat) 得到文件的后缀名: getFilePostfix(oFile) -------------- 函数检索-------------- */ /** * added by LxcJie 2004.6.25 * 去除多余空格函数 * trim:去除两边空格lTrim:去除左空格rTrim: 去除右空格 * 用法: * var str = " hello "; * str = str.trim(); */ String.prototype.trim = function() { $)/g,return this.replace(/(^[\s]*)|([\s]* ""); } String.prototype.lTrim = function() { return this.replace(/(^[\s]*)/g, ""); } String.prototype.rTrim = function() { $)/g,return this.replace(/([\s]* ""); } /********************************** Empty **************************************/ /** *校验字符串是否为空 *返回值: *如果不为空,定义校验通过,返回true *如果为空,校验不通过,返回false 参考提示信息:输入域不能为空! */

javascript常用函数集

javascript常用函数集 javascript提供了许多函数供开发人员使用,下面给出一个简单介绍,更详细的信息请参考Visual InterDev提供的在线关心。 javascript函数一共可分为五类: ·常规函数 ·数组函数 ·日期函数 ·数学函数 ·字符串函数 1.常规函数 javascript常规函数包括以下9个函数: (1)alert函数:显示一个警告对话框,包括一个OK按钮。 (2)confirm函数:显示一个确认对话框,包括OK、Cancel按钮。 (3)escape函数:将字符转换成Unicode码。 (4)eval函数:运算表达式的结果。 (5)isNaN函数:测试是(true)否(false)不是一个数字。 (6)parseFloat函数:将字符串转换成符点数字形式。 (7)parseInt函数:将符串转换成整数数字形式(可指定几进制)。 (8)prompt函数:显示一个输入对话框,提示等待用户输入。例如: eval( )内置函数的用法:计算字符串表达式的值。

JAVASCRIPT面向对象基础总结

javascript面向对象基础 1.使用[]调用对象的属性和方法 functionUser() { this.age=21; this.sex="男?"; } varuser=newUser(); alert(user["age"]); 2.动态添加,修改,删除对象的属性和方法//定义类varuser=newObject(); //添加属性和方法 https://www.wendangku.net/doc/6014378853.html,="cary"; user.age=21; user.show=function(){ alert(https://www.wendangku.net/doc/6014378853.html,+"年?龄?为?:?"+this.age);} //执行方法 user.show(); //修改属性和方法 https://www.wendangku.net/doc/6014378853.html,="James"; user.show=function() { alert(https://www.wendangku.net/doc/6014378853.html,+"你?好?"); } //执行方法 user.show(); //删除属性和方法 https://www.wendangku.net/doc/6014378853.html,="undefined"; user.show="undefined" //执行方法 user.show(); 3.使用大括号{}语法创建无类型对象varobj={}; varuser= { name:"cary", age:21,

show:function(){ alert(https://www.wendangku.net/doc/6014378853.html,+"年?龄?为?:?"+this.age); } } user.show(); varobj={};等价于 varobj=newObject(); 4.Prototype原型对象 每个函数function也是一个对象,对应的类类型为“Function”,每个函数对象都有一个子对象prototype,表示函数的原型,所以当我们new一个类的对象的时候prototype对象的成员都会被实例化为对象的成员。例如: functionclass1() {} class1.prototype.show=function(){ alert("prototyemember"); } varobj=newclass1(); obj.show(); 5.Function函数对象详解 5.1Function和Date,Array,String等一样都属于JavaScript的内部对象,这些对象的构造器是由JavaScript本身所定义的。上面说过函数对象对应的类型是Function,这个和数组的对象是Array一个道理。所以也可以像newArray()一样newFunction()来创建一个函数对象,而函数对象除了使用这种方式还可以使用function关键字来创建。我们之所以不经常使用newFunction()的方式来创建函数是因为一个函数一般会有很多语句,如果我们将这些都传到newFunction()的参数中会显得可读性比较差。varfunctionName=newFunction(p1,p2,...,pn,body)其中p1到pn为参数,body为函数体。 5.2有名函数和无名函数 有名函数:functionfuncName(){}无名函数:varfuncName=function(){}他们之间的唯一区别:就是对于有名函数他可以出现在调用之后再定义,而对于无名函数,他必须是在调用之前就已经定义好。 5.3我们可以利用Function的prototype对象来扩展函数对象,如: Function.prototype.show=function(){ alert("扩展方法"); }

JavaScript函数大全 集合

1.document.write("");为输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document->html->(head,body) 4.一个浏览器窗口中的DOM顺序是:window->(navigator,screen,history,location,document) 5.得到表单中元素的名称和值:document.getElementById("表单中元素的ID号").name(或value) 6.一个小写转大写的JS: document.getElementById("output").value = document.getElementById("input").value.toUpperCase(); 7.JS中的值类型:String,Number,Boolean,Null,Object,Function 8.JS中的字符型转换成数值型:parseInt(),parseFloat() 9.JS中的数字转换成字符型:(""+变量) 10.JS中的取字符串长度是:(length) 11.JS中的字符与字符相连接使用+号. 12.JS中的比较操作符有:==等于,!=不等于,>,>=,<.<= 13.JS中声明变量使用:var来进行声明 14.JS中的判断语句结构:if(condition){}else{} 15.JS中的循环结构:for([initial expression];[condition];[upadte expression]) {inside loop} 16.循环中止的命令是:break 17.JS中的函数定义:function functionName([parameter],...){statement[s]} 18.当文件中出现多个form表单时.可以用document.forms[0],document.forms[1]来代替. 19.窗口:打开窗口window.open(), 关闭一个窗口:window.close(), 窗口本身:self 20.状态栏的设置:window.status="字符"; 21.弹出提示信息:window.alert("字符"); 22.弹出确认框:window.confirm(); 23.弹出输入提示框:window.prompt(); 24.指定当前显示链接的位置:window.location.href="URL" 25.取出窗体中的所有表单的数量:document.forms.length 26.关闭文档的输出流:document.close(); 27.字符串追加连接符:+= 28.创建一个文档元素:document.createElement(),document.createTextNode() 29.得到元素的方法:document.getElementById() 30.设置表单中所有文本型的成员的值为空: var form = window.document.forms[0] for (var i = 0; i

JavaScript对象数组排序函数及六个用法_javascript技巧.docx

JavaScript对象数组排序函数及六个用法 分享一个用于数组或者对象的排序的函数。该函数可以以任意深度的数组或者对 彖的值作为排序基数对数组或的元素进行排序。 代码如下: /** *排序数组或者对象 *by Jinko *date -- *?param object数组或对彖 *@param subkey需要排序的子键,该参数可以是字符串,也可以是一个数组*@param desc 排序方式,true:降序,false] undefined:升序 *?returns {*}返回排序后的数组或者对象 * *注意:对于对彖的排序,如果使用console, log打印对彖的显示可能和排序结果不一致, *其键会被浏览器以字母顺序排序显示,但在for循环中则为正确的排序顺序*/ function sort object (object, subkey, desc) { " var i s_array 二false; if (Object, prototype. toString. call(objeet)二二二[object Array]J) { is_array = true; }" if(is_array) { var keys = {length:object, length}; } else { if(typeof(Object, keys) == ' function") { var keys = Object, keys(object); } else{ var keys 二[]; for (var key in keys) { keys.push (key); } } } for(var i二;i

Javascript-5-函数-下

1:作用域 定义:变量起作用的范围。 在函数外部定义的变量称为全局变量,那么所有的脚本和函数都能访问到它。 在函数内部定义的变量称为局部变量(本地变量),所以只能在函数内部才能访问的到。 注: 1:如果把值赋给尚未声明的变量,该变量将自动作为全局变量声明。 2:变量作用域在函数定义的时候就已经确定下来了。 2:生存周期 JavaScript 变量的生命期从它们被声明的时间开始。 局部变量会在函数运行完毕后被删除。 全局变量会在页面关闭后被删除。 3:with语句(扩展) 定义:为一个或者一组语句指定默认对象。 注意:在严格模式下,with语句不能使用。 提示:with语句是运行缓慢的代码块,尽量避免使用。 4:回调函数 回调函数就是一个通过函数指针调用的函数。

如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。 回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。 5:递归函数 定义:允许内部程序调用自己本身的函数。 特点: 1:在函数里面调用自身。 2:必须有一个明确的递归结束条件,这个称之为递归出口。 3:不确定循环执行的次数。 注:快速排序中就使用到了递归函数。 6:匿名函数及调用方式 定义:顾名思义,就是没有名字的函数。 自运行:自动运行。 调用方式:(function () {})(); 7:构造函数 主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用。构造函数名称首字母一般都大写。

应用: 1:利用递归求100的阶乘。 function recursive(num) { return num === 1 ? 1: num * recursive(num - 1); } 2:利用递归求两个数字的最大公约数。 公约数:亦称“公因数”。它是一个能被若干个整数同时均整除的整数。如果一个整数同时是几个整数的约数,称这个整数为它们的“公约数”;公约数中最大的称为最大公约数。 function getNum(m, n) { var r = m % n; m = n; n = r; return r === 0 ? m : getNum(m, n); }

JavaScript

JavaScript+jQuery实现页面特效 1.下列选项中,不是typeof的返回值的是()。 A.String B.Boolean C.Null D.Undefined 2.分析下列JavaScript代码,经历运算后a的值为()。 Var x=”13”; Var y=”23”; Var a=x+y; A.1323 B.13 C.23 D.程序报错 3.下列语句中,()语句是根据表达式的值进行匹配,然后执行其中的一个语句块。如果找不到匹配项,则执行默认语句块。 A.switch B.if-else C.for D.continue 4.在JavaScript中,运行下列代码后,sum的值是()。 Var sum=0;

For(i=1;i<10;i++){ If(i%5==0) Break; Sum=sum+i; } A.40 B.50 C.5 D.10 5.在JavaScript中,运行下面代码后,在页面上输出()。Var flag; document.write(typeof(flag)); A.Undefined B.Null C.Number D.Boolean 6.下列关于函数说法错误的是()。 A.函数是一段可以重复代码的集合

B.JavaScript中使用function关键字定义函数 C.函数只能在事件中调用 D.函数通常情况下用于处理事件的发生 7.下拉菜单中,用户更改表单元素select中的值时,就会调用()事件处理程序。 A.onChange B.onFocus C.onMouseOver D.onClick 8.当按键盘A时,使用onKeypress事件打印event.KeyCode的结果是()。 A.65 B.13 C.97 D.37 9.关于JavaScript中的函数,下列说法正确的是()。 A.即使声明了形参调用时也可以不传参数

JavaScript的系统函数学习

JavaScript的系统函数学习 1.编码处理函数 1) encodeURI 返回一个对URI字符串编码后的结果。URL是最常见的一种URI; 2) decodeURI 将一个已编码的URI字符串解码成最原始的字符串返回; 3)举例: < Script language = " javascript " > 输出结果如下: encodeStr: https://www.wendangku.net/doc/6014378853.html,/index.jsp?name=%E9%98%BF%E8%9C%9C%E6%9E%9C decodeStr: https://www.wendangku.net/doc/6014378853.html,/index.jsp?name=阿蜜果 2. 数值处理函数 1) parseInt 将一个字符串指定的进制转换为一个整数,语法格式为: parseInt(numString, [radix]) 第一个参数是要进行转换的字符串,是介于2到36之间的数值,用于指定进行字符串转换时

所用的进制。 举例如下: