2014年1月12日星期日

【javascript基础】函数 - 海南默然

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
【javascript基础】函数 - 海南默然  阅读原文»

前言

我在上一篇【javascript基础】基本概念中介绍了javascript的一些基本概念,多谢大家的阅读和意见,自己写的东西可以被大家阅读,真心高兴,刚开始发布的时候我一直盯着阅读人数,虽然知道大家可能就是点开一下而已,但是还是给我一些继续写下去的信心。那今天写一些关于javascript函数的一些知识,帮助大家熟悉或者复习一些函数的基本知识。

PS:最近jQuery源码交流群( 239147101)加了不少热新人,希望大家还是以学习为主,尽量少灌水,给大家一个好的提升自己的环境。

函数

函数在任何一种编程语言中都是一个很重要的结构或者组成部分,编程中的复杂结构和功能都会有函数的参与。javascript中的函数是一个对象,函数对象时Function类型的实例,由于Function类型是一个引用类型,那么函数可以拥有自己的方法和属性,同时也因为函数是一个对象,那么函数名是一个指向函数对象的指针,可以被赋值。下面详细介绍函数的各个部分。

创建函数

函数的创建有三种方式,分别为使用Function的构造函数、函数声明、函数表达式,下面分别介绍这三种方法。

Function构造函数

这种方式是直接new出来一个Function 实例,通过使用Function的构造函数进行创建函数。Function构造函数可以接收任意多个参数,但是最后一个参数会被认为是函数体,前面的所以参数被当做被创建出来的函数的参数。

var test = new Function("a","b","return a + b");//参数a和b,函数体return a + b
console.log(test(1,2));//3

我们可以看出比较的麻烦,并且《javascript高级程序设计》也不推荐我们使用这种方式,主要是因为浏览器要解析常规的javascript代码之外,还要解析传入的参数字符串,这个类似eval()的解释,影响性能。

函数表达式

这种方式是创建的常见方式之一,具体请看

var test = function(a,b){
return a + b;
}
console.log(test(1,2));

上面的代码就是创建一个函数,使用test()进行调用。其实,上面的代码是先创建了一个匿名的函数,之后把这个匿名的函数赋值给test变量。每个函数有一个name属性,这个属性不是ECMA标准的一部分,但是许多地方可以使用它。我们可以给上面的函数起一个名字,具体下面代码

//函数的名字newName
var test = function newName(a,b){
return a + b;
}
console.log(test.name);
//newName

//匿名函数
var nTest = function (a,b){
return a + b;
}
console.log(nTest.name);
//undefined

这个属性在后面详细解释吧。

函数声明

这种方式和C语言中的很类似,这种是最常见的一种创建函数的方法。是通过关键字function直接声明,请看

function test(a,b){
return a + b;
}
console.log(test(
1,2));//3
console.log(test.name);//test

区别

以上介绍了三个创建函数的方式,现在介绍三种的区别,确切的说是后两种的区别,因为Function不推荐使用,性能是一大原因。区别就是使用函数声明这种方式会使函数的声明提前,类似前面我们提到的变量申明的提前。也就是说,使用函数申明方式,我们可以将函数的声明放在调用函数代码的后面,因为解析器会在代码执行之前将函数的声明提升,提到源代码树的顶部,而函数表达式方式则会报错,具体请看

//调用函数
console.log(test(1,2));//3
//
创建函数(函数申明方式)
function test(a,b){
return a + b;
}
//上面的函数相等于
//
创建函数(函数申明方式)
//
function test(a,b){
//
return a + b;
//
}
//
console.log(test(1,2));//3

//调用函数
console.log(ntest(1,2));//TypeError: undefined is not a function
//
创建函数(函数表达式方式)
var ntest = function (a,b){
return a + b;
}

not重载

javascript语言不像java那些语言有函数重载这一概念,其实函数名就是一个指针,指向一个Function实例的地址,当然只能指向一个函数,当然没有重载的概念了,只有覆盖,后面定义的函数覆盖前面定义的函数,具体请看

function test(a,b){
return a + b;
}
//下面的函数覆盖上面的
function test(a,b){
return a + b + 100;
}

console.log(test(
0,0));//100

也就是说如果一个同名的函数表达式和函数申明的函数在一起,无论位置是怎么样的,最后的函数就会是用函数表达式创建的函数,因为函数申明会提升到顶部嘛,看看下面的代码

var test = function (a,b){
return a + b -100;
}

function test(a,b){//会被下面的函数覆盖
return a + b;
}

function test(a,b){//会被函数表达式覆盖
return a + b + 100;
}

console.log(test(
0,0));//-100

内部属性

函数的内部有两个重要的对象:arguments和this。

arguments

arguments是一个类似组对象,包含所以传入函数的所有参数, 写程序或者面试中常问的就是如何将arguments转化完成一个数组,请看

Array.prototype.slice.call(arguments);
Array.prototype.slice.call(arguments,
0);
Array.prototype.slice.call(arguments,
0,arguments.length);
Array.apply(
this, arguments); //没用过
Array.apply(null, arguments); //没用过

arguments有一个length属性,表示函数传入参数的个数,还有一个callee属性,这是一个指针,指向拥有这个arguments的函数,这个主要是在函数内部调用自己时使用,也就是递归时使用。看个例子就明白了

function test(count){
console.log(
"参数:"+arguments[0]+"个数:"+arguments.length);
if(count <= 0){
console.log(
"递归"+count+" 结束了"ASP.Net页面传值比较 - 迷失的醉猫  阅读原文»

作为一个ASP.Net程序员,尤其是搞B/S开发的,对于不同页面之间变量值的传递用的非常广泛,而掌握不同方式之间的区别和特点也就很有必要。本文将针对这一知识点做一个简单的总结。

页面之间传值大致可以分为以下几种:通过Get方式传递,通过Post方式传递,通过Session方式,通过Cookie方式和,通过Application方式,通过Cache方式,通过页面属性方式和通过静态变量的方式。下面将对于以上几种方式作一个对比:

1、Get方式:通过Get方式在页面之间传值用的非常普遍,用法也非常简单,只需将需要传递的参数附在Url后边即可,如:要访问当前页面,http://www.cnblogs.com/xsyblogs/admin/EditPosts.aspx?opt=1,我们可以看到在Url的最后,有一个“opt=1”的字样,这即我们要传递的参数。在当前页面,如果我们要获取这个参数,只需通过Request.Querystring("opt")方法,即可获取到传递的参数值。因为其是将参数附在Url中,所以其安全性也就可想而知了,但是对于像传递要获取的页码,要获取文章的ID这类参数非常有用。Get方式还有一个致命的缺陷就是最长只能传递255个字符,但对于简单、少量的数据还是非常有用。

2、Post方式:用的最多的除了Get也就是Post了,相对于Get而言,Post似乎更安全,它通过将需要提交的数据封装在隐藏域中,虽然稍微懂点开发的朋友都知道Post方式提交也可以通过浏览器的开发工具来查看,但对于我们平时使用来说,已经足够了。如果需要通过Post方式提交数据,必须有name属性,在服务端通过Request.Form("keyword")的方式获取。Post方法适用于大数据,包括文件上传。

对于Get方式和Post方式的区别在这里稍微给出一个对比:见下图。

3、Session方式

Session方式也是很常见的一种保存页面值的方法,它将用户数据存储在服务器端,将一个ID存放在客户端作为与服务端验证的标记。我们可以把用户名放在Session中,这样就能通过判断Session中某个key的值来判断用户是否登录,登录的话用户名又是多少。Asp.Net中可以设置Session的存储方式,位置,SessionId的保存是否依赖于Cookie。Session的存储有三种方式:

Inproc(默认),Session存储在IIS进程中。

StateServer,Session存储在独立的Windows服务进程中(可以不是Web服务器)。

SqlServer,Session存储在SqlServer数据库的表中(SqlServer服务器)。

虽然InProc模式的Session直接存储在Web服务器IIS进程中,速度比较快,但是每次重新启动IIS都会导致Session丢失。利用后两种模式,我们就完全可以把Session从Web服务器中独立出来,从而减轻Web服务器的压力,同时减少Session丢失的概率。

因此,SessionID存储在客户端(可以是Cookie或者URL),其他都存储在服务端(可以是IIS进程、独立的Windows服务进程或者SQL Server数据库中)。

Session原理图如下:

4、Application方式

将数据存储于Application,相当于一个全局变量,整个站点数据共享,在整个应用程序的生命周期内都是有效的,适用于所有页面,所有用户共享的数据。其适用方法类似于Session,也是通过键值对的形式来取值和赋值。

5、Cookie方式

Cookie方式不失为将数据保存在客户端的经典方式。但由于存储在客户端,其安全性低,受客户端设置的限制。下面请看Cookie原理图:

6、Cache方式

Cache在页面传值这里用的不是太普遍,但也有这方面的功能。Cache主要是将用户数据存储在服务器数据缓存中,可以直接存储对象,但是对数据的更新不及时。用法:Cache["username"]="xiaosy";

7、页面属性

这里所说的页面属性是指利用HttpContext获取发请求的页面的信息。我们常说页面类对象,既然通过HttpContext把这个页面类对象都拿到了,又何愁拿不到里面的变量呢?但是通过这种方式有一点要注意,就是强制转换类型一定要正确,不然就啥也拿不到哦。这里举两个例子:

获取控件的值:

获取公共变量:

另外还可以通过以下这种方式获取值:

8、静态变量方式

静态变量就是申明一个变量,然后赋值,然后在需要用的时候再取这个变量的值。在这里就不举例了。

9、ViewState

ViewState是Asp.Net特有的页面保持机制,用来恢复页面的状态,无状态的Http请求也因为有了ViewState的存在而变得有状态。ViewState主要是将页面各控件及其所存数据序列化存在name为_ViewStated的隐藏域中。主要适用于页面PostBack需要保存的数据,数据太大也会影响页面发送效率。其原理图如下:


本文链接:http://www.cnblogs.com/xsyblogs/p/3517115.html,转载请注明。

阅读更多内容

没有评论:

发表评论