`
Flory
  • 浏览: 24703 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

深入学习javascript(Function Array)

 
阅读更多
深入学习javascript(原创)

本文主要讲解一些关于函数,数组的高级用法
一。首先看下函数的一些用法
1.) arguments
arguments在函数中返回的是所有实参的信息,
arguments.length是指实参的个数
arguments[0]是指第一个实参,以此类推
举例:
<script type="text/javascript">
function fun1(){
alert(arguments.length);
for(var i=0;i<arguments.length;i++){
alert(arguments[i]);
}

}

//调用方法
fun1('a','b','c');
//输出 3
//输出a b c;
</script>
2.)arguments.callee
arguments.callee在函数中指的是函数本身,就是说alert(arguments.callee)方法可以打印这个函数提的内容
而arguments.callee.length却是指函数的形参个数。

3.)caller
caller看表面意思应该就能够理解了,指的是调用者的意思,可能你还没有理解是什么意思,看了下面的列子就应该可以明白了
<script type="text/javascript">
function fun2(){
alert(fun2.caller);
}

</script>

<input type="button" value="测试" onclick="fun2('zhangsan')" />
当点击"测试"按钮时会打印
function anonymous(){
fun1('zhangsan');
}

anonymous意思是匿名的意思,因为当前没有函数调用fun2,所以属于匿名调用了
再看下面的例子
<script type="text/javascript">
function fun2(){
alert(fun2.caller);
}

fun3(){
fun2('zhangsan');
}

</script>

<input type="button" value="测试" onclick="fun3()" />
当点击"测试"按钮时会打印
fun3(){
fun2('zhangsan');
}
就是把fun3代码打印出来了,这些子应该理解了,就是指谁调用了我,没有人调用就是匿名了,不过如果直接在js中调用fun2();会打印null的

4.)call
call方法JScript参考中的说明:调用一个对象的一个方法,以另一个对象替换当前对象。call([thisObj[,arg1[, arg2[, [,.argN]]]]])
call方法真的很神奇的,不仅可以用call来调用一个方法,而且js的继承也可用call来实现,讲解起来比较难以理解,我们还是来看看几个列

子吧

<script type="text/javascript">
function fun3(str){
alert("the param is "+str);
}

function fun4(){
fun3.call(this,"aaa");
}
</script>

<input type="button" value="测试" onclick="fun4()" />
当点击"测试"按钮时会打印
the param is aaa
我们可以在别的方法中用call来调用另一个方法其实fun2.call(this,"aaa") 和 fun2("aaa")效果是差不多的
从这点列子我们还看不出太多的门道,继续放下看
<script type="text/javascript">
function fun3(str){
this.arg=str;
this.fun3_f1=function(){
alert(this.arg);
}

}

function fun4(){
fun3.call(this,"aaa");
this.fun3_f1();
}
</script>

<input type="button" value="测试" onclick="fun4()" />
当点击"测试"按钮时会打印
aaa
为什么呢,你看懂了吗
当我们在fun4中调用fun3.call(this,"aaa");后fun4就具有了fun3对象的所有权限,fun4就可以调用fun3中所有的方法和属性,
其实就是fun4已经继承了fun3,
这里的this可以换成其他的对象,如果换成其他对象的话,fun4就不再继承fun3了,而是被替换的对象继承,例如
<script type="text/javascript">
function fun3(str){
this.arg=str;
this.fun3_f1=function(){
alert(this.arg);
}

}

function fun4(){
var f5=new Function();
fun3.call(f5,"aaa");
alert(this.arg);
alert(f5.arg);
}
</script>

<input type="button" value="测试" onclick="fun4()" />
当点击"测试"按钮时会打印
undefined
aaa
其他的就不用再多说了吧

5.)apply
apply方法JScript参考中的说明:应用某一对象的一个方法,用另一个对象替换当前对象。apply([thisObj[,argArray]])
从构造函数看,其实它和call基本差不多的,只是它的参数是个数组而已,开一个简单的例子
<script type="text/javascript">
function fun3(str){
this.arg=str;
this.fun3_f1=function(){
alert(this.arg);
}

}

function fun4(){
var f5=new Function();
fun3.apply(f5,["aaa"]);
alert(this.arg);
alert(f5.arg);
}
</script>

<input type="button" value="测试" onclick="fun4()" />
打印结果和上面的例子一样,看出来区别了吗,呵呵,就是把"aaa",换成了数组["aaa"];其他的我不想再多说了,还是自己练习下吧。


二、我们看看一点点数组的用法吧,别看js数组功能可不少我,我在这里只是说其中的一部分,因为我也不都知道,呵呵
一般初学者用数组怎么用呢,一般都是这样用:
var arr=new Array();
arr[0]="aaa";
arr[1]="bbb";

或者高级点
for(var i=0;i<10;i++){
arr[i]=i*3;
}
等等;那数组到底有哪些好用的方法呢,我们就来看几个吧

1.)push方法 想数组中添加一个元素
var arr = new Array();
arr.push("aaa");
arr.push("bbb");
arr.push("ccc");
这样数组就有了三个元素了,简单吧,以后就不用arr[0]...赋值了 呵呵

2.)shift()方法,干什么的呢,它是用来删除并返回数组中的第一项(如果数组为空,则返回null);
var arr = new Array();
arr.push("aaa");
arr.push("bbb");
arr.push("ccc");

var a1=arr.shift();
alert(arr.length);
alert(a1);
打印
2
aaa

3.)sort()方法,不用说给数组排序了
不过这个方法需要一个“排序器”参数,什么是排序器呢compare,我来写个吧,其实和java的很像的
<script type="text/javascript">
var arr = new Array();
arr.push("aaa");
arr.push("ddd");
arr.push("bbb");
arr.push("ccc");

//自定义排序器
var compare=function (param1,param2){
if(param1>param2){
return 1;
}else if(param1<param2){
return -1;
}else{
return 0;
}
}

alert("排序前");
alertArr(arr);
arr.sort(compare);
alert("排序后");
alertArr(arr);

function alertArr(arr){
for(var i=0;i<arr.length;i++){
alert(arr[i]);
}
}
</script>

结果自己运行下了,排序好了,呵呵,自定义排序器你可以自己随便写,只要返回值为 1 0 -1 就OK了,和java差不多吧

4.)join(param)方法
这个方法很简单哦,就是把你所有数组中的变量用param分割开来,最常用的就是url后面的参数表达式了
var arr = new Array();
arr.push("aaa");
arr.push("ddd");
arr.push("bbb");
arr.push("ccc");

var str=arr.join("&");
alert(str);
结果
aaa&ddd&bbb&ccc
简单吧

5.)slice()方法
该slice方法返回数据的指定区段。该slice方法不会改变原始的数组,返回的是一个全新的数组拷贝,而不是原始数组引用,所以无论是改变

原始数组还是新数组,双方均不受影响。该slice方法通过由零开始计算的数组下标来确定切割的部分,创建一个由下标begin开始,到下标

end-1止的新数组(如果end未被指定,默认为最后一个元素)。如:
代码:


var trees = ["aaa", "bbb", "ccc", "ddd", "eee"];
alert(trees.slice(1,4));

输出:
bbb,ccc,ddd

该slice方法的参数问题。如果使用负数的end,则返回由下标begin到下标length-ABS(end)-1(注:ABS(end)表示绝对值的end)的新数组;同理

,使用负数的begin类同:下标为length-ABS(begin)。

三、实例说明

好了说的够多了了,手都写累了,最后结合上面说的,举一个实用的例子吧
大家都用过setTimeout吧,setTimeout在对调用函数传参数的时候比较麻烦,那我们就来从写setTimeout吧,然参数传递变得简单
(这个例子是引用别人的,现在看起来是不是很简单了,以后自己用什么不方便的话,就重写吧)
var st = window.setTimeout;
window.setTimeout = function(fun, params) {
if(typeof fun== 'function'){
var args = Array.prototype.slice.call(arguments,2);
var f = function(){
fun.apply(null, args);

};
return st(f, params);
}
return st(fun,params);
}
function test(str){
alert(str);
}
window.setTimeout(test,1000,'aaa');

这个例子原理就不解释了,只做一点点说明Array.prototype.slice.call其实就是调用数组的slice()方法,不过这里用
arguments.slice(2)不行,会有异常的(具体什么原因我还没搞清楚,可能arguments中是对象的原因)
你可以通过
var arr=new Array();
for(var i=0;i<arguments.length;i++){
arr.push(arguments[i]);
}
var args=all.slice(2);
这样可以的

好了就到这里吧,如果上面有什么不对的,希望回帖帮我指出,或者又补充的都可以....

版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

    JavaScript学习基础学习心得

    ### JavaScript 学习基础心得 在深入探讨JavaScript的基础深度原理之前,我们首先了解JavaScript的一些基本概念,这将有助于我们更好地...对于初学者来说,掌握这些基础知识是非常重要的,它们是后续深入学习的基础。

    JavaScript数组对象Array案例.pdf

    本文将深入探讨JavaScript数组对象Array的一些关键知识点,并通过提供的案例进行解析。 首先,数组的创建有多种方式。最常见的是使用`new Array()`构造函数,如`var arr = new Array(1, 2, 3, 4, 5, 6)`,这会创建...

    javascript function、指针及内置对象

    JavaScript是一种面向对象的脚本语言,它在Web浏览器中被广泛使用,主要用来开发网页的动态效果和实现前后端的交互。JavaScript中的函数是...掌握这些基础知识点,是深入学习JavaScript及其在Web开发中应用的第一步。

    javascript学习ppt文档

    这个"javascript学习ppt文档"将深入浅出地介绍这些概念,帮助初学者快速上手JavaScript,为构建动态、交互性强的网页打下坚实基础。通过学习这个教程,你将能够理解和编写基本的JavaScript代码,并逐步进阶到更高级...

    JavaScript基础篇(3)之Object、Function等引用类型

    JavaScript中的引用类型主要涉及到Object、Array、Date、RegExp和Function等类型。它们具有以下特点和知识点: 1. Object类型是JavaScript中最为基础和常用的引用类型。它可以用来模拟现实世界中的对象模型,存储...

    深入理解JavaScript特性1

    《深入理解JavaScript特性1》是一本面向前端开发者和JavaScript编程爱好者的指南,旨在帮助读者掌握JavaScript语言的新进展,特别是ECMAScript 6 (ES6)引入的诸多特性。书中通过丰富的实例,逐步解析了JavaScript的...

    javascript学习总结.doc

    在本文中,我们将深入探讨JavaScript的学习总结,包括其对象、DOM、历史与位置对象、变量、表达式、运算符、数据类型、函数以及对象的扩展。 首先,JavaScript中的对象分为三类:内置对象、DOM对象和自定义对象。...

    javascript入门教程.docx

    ### JavaScript入门教程详解 #### 一、基础概念 **JavaScript**是一种功能强大的脚本语言,以其轻量级...通过以上内容的学习和实践,你将能够掌握JavaScript的基本知识和编程技能,为进一步深入学习打下坚实的基础。

    javascript学习总结

    在深入学习JavaScript时,理解和掌握函数是至关重要的,因为它们是组织代码、执行特定任务的基本单元。 函数在JavaScript中扮演着核心角色,允许我们将代码封装到可重用的块中。创建函数有两种主要方式:函数声明和...

    深入学习JavaScript对象

    1. **内置对象**:如Array、Function、Date等,是由JavaScript引擎提供的,具备预定义的行为和属性。 2. **宿主对象**:由运行JavaScript的环境(如浏览器)提供,如HTMLElement,它们与特定的执行环境紧密相关。 3....

    javascript函数式编程

    JavaScript函数式编程是一种编程范式,它强调将计算视为数据处理,通过...虽然《functional-programming-in-javascript》这本书可能存在一些小错误,但作为实践型的资源,它仍然是学习JavaScript函数式编程的宝贵资料。

    javascript中数组array及string的方法总结

    在学习JavaScript的过程中,不断总结和实践是非常重要的。掌握这些基本的数组和字符串方法,将有助于我们更有效地处理数据,编写出高效且易维护的代码。通过不断的学习和实践,我们可以逐步提升自己的编程技能,达到...

    JavaScript基础练习_day4

    更多关于闭包的信息可以参考[学习JavaScript闭包](http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html)。 总结来说,本练习涉及了JavaScript中多个重要的基础概念,包括作用域、异步处理、...

    深入学习JavaScript 高阶函数

    深入学习JavaScript高阶函数是理解JavaScript编程核心概念的关键部分。高阶函数,即Higher-order function,是指能够接受函数作为参数,或返回一个函数的函数。它们在JavaScript中扮演着重要角色,因为它们允许我们...

    javascript指南和函数式编程

    3. **数组和集合**:学习JavaScript中的数组操作,如map、filter、reduce等高阶函数的运用,以及Set和Map等ES6新增集合类型的使用。 4. **函数**:理解闭包、作用域和this的关键概念,学习箭头函数的语法和特性。 5....

    JavaScript个人学习笔记

    此外,JavaScript还有许多其他特性,如作用域、闭包、原型链、异步编程等,这些都是深入学习JavaScript时需要掌握的重要概念。随着技术的发展,现代JavaScript(如ES6及以上版本)引入了更多的新特性,如箭头函数、...

    编程实践:JavaScript进阶100例

    《编程实践:JavaScript进阶100例》是一份专为初级JavaScript学习者设计的资源,旨在通过丰富的实例帮助初学者深入理解这门语言。这份PDF文档包含了一系列精心挑选的编程练习,覆盖了JavaScript的核心概念和实用技巧...

Global site tag (gtag.js) - Google Analytics