做网站的财务需求设计新颖的兰州h5制作
news/
2025/10/4 10:44:26/
文章来源:
做网站的财务需求,设计新颖的兰州h5制作,ftp上传网站步骤,wordpress字体图标(注#xff1a;在看到大家如此关注JS里头的这几个对象#xff0c;我试着把原文再修改一下#xff0c;力求能再详细的阐明个中意义 2007-05-21#xff09;在提到上述的概念之前#xff0c;首先想说说javascript中函数的隐含参数#xff1a;arguments Arguments 该对象代表…(注在看到大家如此关注JS里头的这几个对象我试着把原文再修改一下力求能再详细的阐明个中意义 2007-05-21在提到上述的概念之前首先想说说javascript中函数的隐含参数arguments Arguments 该对象代表正在执行的函数和调用它的函数的参数。[function.]arguments[n]参数function 选项。当前正在执行的 Function 对象的名字。 n 选项。要传递给 Function 对象的从0开始的参数值索引。 说明 Arguments是进行函数调用时除了指定的参数外还另外创建的一个隐藏对象。Arguments是一个类似数组但不是数组的对象说它类似数组是因为其具有数组一样的访问性质及方式可以由arguments[n]来访问对应的单个参数的值并拥有数组长度属性length。还有就是arguments对象存储的是实际传递给函数的参数而不局限于函数声明所定义的参数列表而且不能显式创建 arguments 对象。arguments 对象只有函数开始时才可用。下边例子详细说明了这些性质: //arguments 对象的用法。function ArgTest(a, b){ var i, s The ArgTest function expected ; var numargs arguments.length; // 获取被传递参数的数值。 var expargs ArgTest.length; // 获取期望参数的数值。 if (expargs 2) s expargs argument. ; else s expargs arguments. ; if (numargs 2) s numargs was passed.; else s numargs were passed.; s \n\n for (i 0 ; i numargs; i){ // 获取参数内容。 s Arg i arguments[i] \n; } return(s); // 返回参数列表。} 在此添加了一个说明arguments不是数组(Array类)的代码: Array.prototype.selfvalue 1;alert(new Array().selfvalue);function testAguments(){ alert(arguments.selfvalue);} 运行代码你会发现第一个alert显示1这表示数组对象拥有selfvalue属性值为1而当你调用函数testAguments时你会发现显示的是“undefined”说明了不是arguments的属性即arguments并不是一个数组对象。在此附加上大家推荐的一个简单方法 alert(arguments instanceof Array);alert(arguments instanceof Object); caller 返回一个对函数的引用该函数调用了当前函数。 functionName.caller functionName 对象是所执行函数的名称。说明对于函数来说caller 属性只有在函数执行时才有定义。如果函数是由顶层调用的那么 caller 包含的就是 null 。如果在字符串上下文中使用 caller 属性那么结果和 functionName.toString 一样也就是说显示的是函数的反编译文本。下面的例子说明了 caller 属性的用法 // caller demo {function callerDemo() { if (callerDemo.caller) { var a callerDemo.caller.toString(); alert(a); } else { alert(this is a top function); }}function handleCaller() { callerDemo();} callee 返回正被执行的 Function 对象也就是所指定的 Function 对象的正文。[function.]arguments.callee 可选项 function 参数是当前正在执行的 Function 对象的名称。 说明 callee 属性的初始值就是正被执行的 Function 对象。 callee 属性是 arguments 对象的一个成员它表示对函数对象本身的引用这有利于匿名函数的递归或者保证函数的封装性例如下边示例的递归计算1到n的自然数之和。而该属性仅当相关函数正在执行时才可用。还有需要注意的是callee拥有length属性这个属性有时候用于验证还是比较好的。arguments.length是实参长度arguments.callee.length是形参长度由此可以判断调用时形参长度是否和实参长度一致。 示例 //callee可以打印其本身function calleeDemo() { alert(arguments.callee);}//用于验证参数function calleeLengthDemo(arg1, arg2) { if (arguments.lengtharguments.callee.length) { window.alert(验证形参和实参长度正确); return; } else { alert(实参长度 arguments.length); alert(形参长度 arguments.callee.length); }}//递归计算var sum function(n){ if (n 0) return 1; else return n arguments.callee(n - 1)} 比较一般的递归函数 var sum function(n){ if (1n) return 1;else return n sum (n-1); 调用时alert(sum(100));其中函数内部包含了对sum自身的引用函数名仅仅是一个变量名在函数内部调用sum即相当于调用一个全局变量不能很好的体现出是调用自身这时使用callee会是一个比较好的方法。 apply and call 它们的作用都是将函数绑定到另外一个对象上去运行两者仅在定义参数方式有所区别 apply(thisArg,argArray); call(thisArg[,arg1,arg2…] ]); 即所有函数内部的this指针都会被赋值为thisArg这可实现将函数作为另外一个对象的方法运行的目的 apply的说明 如果 argArray 不是一个有效的数组或者不是 arguments 对象那么将导致一个 TypeError。如果没有提供 argArray 和 thisArg任何一个参数那么 Global 对象将被用作 thisArg 并且无法被传递任何参数。 call的说明 call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisArg指定的新对象。如果没有提供 thisArg参数那么 Global 对象被用作 thisArg 相关技巧 应用call和apply还有一个技巧在里面就是用call和apply应用另一个函数类以后当前的函数类就具备了另一个函数类的方法或者是属性这也可以称之为“继承”。看下面示例: // 继承的演示function base() { this.member dnnsun_Member; this.method function() { window.alert(this.member); }}function extend() { base.call(this); window.alert(member); window.alert(this.method);} 上面的例子可以看出通过call之后extend可以继承到base的方法和属性。 顺便提一下在javascript框架prototype里就使用apply来创建一个定义类的模式 其实现代码如下 var Class { create: function() { return function() { this.initialize.apply(this, arguments); } }} 解析从代码看,该对象仅包含一个方法Create其返回一个函数即类。但这也同时是类的构造函数其中调用initialize而这个方法是在类创建时定义的初始化函数。通过如此途径就可以实现prototype中的类创建模式。 示例 var vehicleClass.create();vehicle.prototype{ initialize:function(type){ this.typetype; }, showSelf:function(){ alert(this vehicle is this.type); }}var motonew vehicle(Moto);moto.showSelf(); --附加说明 1.var vehicleClass.create(); 相当于如下代码 var vehiclefunction() { this.initialize.apply(this, arguments); } 2.“this.initialize.apply(this, arguments);”主要作用有2个 一、是把vehicle类构造函数的参数arguments传递给方法initialize 二、是执行initialize方法。 3.vehicle类在实例化时调用了“带参数的构造函数” vehicle(Moto),而构成函数中又调用了vehicle类的自定义的initialize函数当作初始化用。 更详细的关于prototype信息请到其官方网站查看。 评论还有更精彩对此的理解在这我就不再添加了大家可以看看加深理解。 摘自http://www.cnblogs.com/sunwangji/archive/2006/08/21/482341.html 摘取部分评论 this.initialize.apply(this, arguments); 对于这句话2个this指的是同一个内容 var vehicleClass.create(); 执行过后this都指向vehicle本身。 prototype.js的写法目的是规定一个创建类的框架这个框架内类的初始化函数名一定是initialize而那句令人费解的话的语义是保证initialize一定会在类的实例创建后调用。 如果不用统一的框架创建类的话我们可以这样写 代码 function vehicle(type) { alert(arguments instanceof Array); this.init function() {//这里就可以不叫initialize了 this.type type; } this.showSelf function() { alert(this vehicle is this.type); } this.init();//那句难解的话其实就是要给每个类都注入这句话而已 }var moto new vehicle(moto);moto.showSelf(); 通过这种写法你得到的moto实例和上面写法的得到的是一摸一样的。 总的来讲看了你的总结很有帮助。 我常用我写的这种方法创建类所以对于call apply的理解很模糊 js是脚本语言所以脚本的灵活性造成了无法做接口、类的继承检查 无法统一规定类构造函数的写法等等所以prototype用了很绕的方法 目的只有一个 强制规定所有类的初始化方法都叫initialize然后方便管理了就。 能把function搞成既指Class又指method的只有javascript了对于这种天生蹩脚的语言还是少用OO思维的好。 对于这句this.initialize.apply(this, arguments); 为什么不用this.initialize(arguments)是因为2者的语义是不同的。 表面上2者都是在function constructor里调用initialize函数期到OO里的non default constructor的作用。 但是this.initialize.apply(this, arguments)中通过apply函数可以使得传给function constrctor的参数列表都传给initialize函数。这是实际场景中的非匿名构造函数的调用。 而调用this.initialize(arguments)实际上是initialize函数只接受了一个参数那就是arguments这个对象而不是我们希望传入的参数列表 jQuery應用了大量apply/call(主要是因為這些功能都是完全跨瀏覽器的) 转载于:https://www.cnblogs.com/qiantuwuliang/archive/2011/01/03/1924390.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/927036.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!