JS中调用/应用、参数和未定义/空方法的详细说明
A.调用和应用方法的详细说明。
方法调用:
语法:调用([thisobj [,arg1 [,arg2 [,[,]。argn]]])。
定义:调用一个对象的方法,用另一个对象替换当前对象。
描述:调用方法可以用来调用一个方法,而不是另一个对象。调用方法可以将函数的对象上下文从初始上下文更改为由thisObj指定的新对象。如果没有提供thiobj参数,全局对象将被用作thiobj。
应用方法:
语法:apply([thisObj[,argArray]])
定义:应用一个对象的方法,用另一个对象替换当前对象。
说明:如果argArray不是有效的数组或参数对象,将导致类型错误。如果既没有提供argArray参数,也没有提供thisObj参数,那么全局对象将被用作thisObj,并且不能传递任何参数。
示例学习:
函数add(a,b){ alert(a,b);}功能sub(a,b){ alert(a-b);}add.call(sub,3,1);打印结果为4。调用add函数,但调用对象(上下文)不是add对象,而是子函数对象。注意:js中的函数实际上是一个对象,函数名是对函数对象的引用。
函数Animal(){ this . name=' Animal ';this . show name=function(){ alert(this . name);} }函数Cat(){ this . name=' Cat ';} var Animal=new Animal();var Cat=new Cat();animal.showName.call(cat,',');//输出结果为‘cat’animal . show name . apply(cat,[]);//输出结果是‘Cat’调用,意思是把animal的方法放到Cat上执行。背景是猫。本来,猫没有showName()方法,现在却把动物的showName()方法放在猫身上执行,而猫的这个. Name就是猫。所以这个名字应该是猫。
实现继承。
函数Animal(name){ this . name=name;this . show name=function(){ alert(this . name);} }函数Cat(name){ Animal.call(this,name);} var cat=新猫('黑猫');cat . show name();Animal.call(这个)的意思是调用Animal方法,但是用这个对象代替Animal对象,上下文就变成了这个。在新的Cat(“黑猫”)中,Animal.call用于设置当前上下文的属性名和方法显示名。
扩展:多重继承。
function class 10(){ this . ShowSub=function(a,b){ alert(a-b);} }函数Class11(){this.showAdd=函数(a,b){ alert(a,b);} }函数class 2(){ class 10 . call(this);class 11 . call(this);}注意:还有其他继承js的方法,比如使用prototype chain,这不在本文的讨论范围之内,但是这里解释了call的用法。当然,说调用apply,这两个方法的意思基本相同,不同的是,调用的第二个参数可以是任何类型,而apply的第二个参数必须是数组或参数。
B.使用b.arguments。
-
什么是论点?
Arguments是JavaScript中的内置对象。很奇怪,经常被忽略,但其实很重要。所有主要的js函数库都使用参数对象。因此,items对象必须是javascript程序员熟悉的。
的所有函数都有自己的参数对象,其中包括函数要调用的参数。它不是数组。如果使用参数类型,它将返回“object”。虽然我们可以通过调用数据来调用参数。例如,长度和索引方法。但是几组推送和弹出对象并不适用。
使用参数创建灵活的函数。
论证对象看似用途非常有限,但实际上是一个非常有用的对象。通过使用参数对象,可以使函数调用不定数量的参数。狄恩爱德华兹的base2库中有一个格式化的函数,展示了这种灵活性。
函数格式(字符串){var args=参数;var pattern=new RegExp(' %([1-' arguments . length '])',' g ');返回字符串。replace(pattern,function(match,index,position,all)){ console . log(match ' ' index ' ' position ' ' all);返回args[index];});};使用格式('和% 1想知道你% 3是谁的% 2 ','文件','衬衫','穿');结果是“报纸想知道你穿的衬衫”;将控制台打印为。
8and ,% 1想知道你是谁的% 2 ,%3 ,% 1想知道你是谁的% 2 ,% 1想知道你是谁的% 3
将参数对象转换为实数组。
尽管arguments对象不是真正的javascript数组,但我们可以轻松地将其转换为标准数据,然后执行数组操作。
var args=array . prototype . slice . call(参数);变量args现在包含一个包含函数所有参数的标准javascript数组对象。
扩展:使用上一节中的格式函数,通过预设的参数对象创建一个函数。
函数MakeFunc(){ var args=Array . prototype . slice . call(参数);var func=args . shift();return func(){ return func . apply(null,args . concat(array . prototype . slice . call(arguments)));};}此方法将取出第一个参数,然后返回curried函数。这个curried函数的参数(第二个参数)将从第二个参数开始与makeFunc的参数组合成一个新数组。并返回makeFunc第一个参数的apply调用。
执行
var majorTom=makeFunc(格式为,‘这是主汤姆呼叫地面控制。我是%1。);majorTom(“穿过门”);结果是:“我是地面控制中心的汤姆少校。我正要进门。'
控制台打印:41我是地面控制中心的汤姆少校。我是% 1。
【功能。]参数。被调用方
描述:参数。被调用方方法返回正在执行的函数本身。
被调用方属性是arguments对象的成员,表示对函数对象本身的引用,有利于匿名函数的递归或者保证函数的封装。例如,在下面的示例中,递归计算从1到n的自然数之和。此属性仅在相关函数执行时可用。还应该注意的是,被调用者有一个长度属性,这对于验证来说有时更好。Arguments.length是参数的长度,arguments . caller . length是形式参数的长度(定义时指定的必选参数),所以调用时可以判断形式参数的长度与实际参数的长度是否一致。
//用于验证参数函数callelentdemo(arg 1,arg2) {if(参数。length==参数。被呼叫者。length) {window.alert('验证形式参数和实际参数的长度是否正确!');返回;} else {alert('参数长度:' arguments . length);Alert('参数长度:' arguments . cauer . length ');} }//递归计算varsum=function(n){ if(n=0)return 1;Else返回n个参数.被调用者(n-1)}//更一般的递归函数:var sum=function (n) {if (1==n)返回1;否则返回n和(n-1);}被称为:alert(sum(100));函数包含对sum本身的引用,函数名只是一个变量名。在函数内部调用sum相当于调用一个全局变量,不能很好地反映调用本身。因此,使用被调用者是一个更好的方法。
展开functionName.caller
描述:返回谁调用了functionName函数。functionName对象是正在执行的函数的名称。对于函数,调用方属性仅在函数执行时定义。如果函数由顶层调用,则调用方包含null。如果在字符串的上下文中使用调用者属性,则结果与functionName.toString相同,即显示函数的反编译文本。以下示例说明了调用者属性的用法:
//调用方演示{函数caller demo(){ if(caller demo . caller){ var a=caller demo . caller . tostring();警报(a);} else {alert('这是一个顶级函数');} }函数handleCaller(){ callerDemo();} handleCaller();执行结果:
C.undefined和null。
-
大多数计算机语言只有一个表示‘无’的值,例如,C语言为null,Java语言为NULL,Python语言为none,Ruby语言为nil。有点奇怪的是,JavaScript语言有两个表示“无”的值:undefined和null。这是为什么?
类似
在JavaScript中,老实说,将变量指定为undefined或null几乎没有区别。
代码:如下。
var a=未定义;var a=null在上面的代码中,一个变量被分别赋值为undefined和null,两者几乎是等价的。
Undefined和null在if语句中会自动转换为false,而equality运算符甚至会直接报告它们相等。
if(!undefined)console . log(' undefined为false ');//undefined为falseif(!null) console.log('null为false ');//null为false undefined==null//true上面的代码展示了行为是多么的相似!但是当我们查看未定义和null的各自类型时,我们发现类型是不同的。js基类型中没有null类型。
类型为null//“object”类型未定义;//‘undefined’既然undefined和null的含义和用法相似,为什么要同时设置两个这样的值呢?这难道不是困扰初学者的JavaScript复杂性的无端增加吗?谷歌公司开发的JavaScript语言的替代品Dart语言明确规定只有null,没有undefined!
历史原因
原来,这和JavaScript的历史有关。当JavaScript在1995年诞生时,就像Java一样,只有null被设置为代表“none”的值。
根据c语言的传统,null被设计为自动转换为0。
Number(null) //05 null //5
然而,JavaScript的设计者Brendan Eich认为这还不够,原因有二。
首先,像在Java中一样,null被视为一个对象。
null//“object”的类型
但是JavaScript的数据类型可以分为原始和复杂两类,Brendan Eich认为代表‘none’的值不应该是对象。
其次,JavaScript的原始版本没有包含错误处理机制,当数据类型不匹配时,往往会自动转换类型或者静默失败。Brendan Eich认为,如果null自动变成0,就不容易发现错误。因此,布兰登艾希设计了另一个未定义的。
原设计
JavaScript的原始版本区分如下:null是表示‘none’的对象,转换为数值时为0;Undefined是表示“none”的原始值,当转换为数值时为NaN。
number(undefined)//NaN 5 undefined//NaN
的当前用法。
然而,上述区别很快被证明在实践中是不可行的。目前,null和undefined基本上是同义词,只有一些细微的区别。
Null表示“没有对象”,也就是说,那里不应该有值。典型用法是:
(1)作为函数的参数,意味着函数的参数不是对象。
(2)作为对象原型链的终点。
object . getprototypeof(object . prototype)//null
Undefined表示‘缺少值’,也就是这里应该有一个值,但是还没有定义。典型用法是:
(1)当一个变量被声明但未赋值时,它等于undefined。
(2)调用函数时,没有提供应该提供的参数,参数等于undefined。
(3)对象没有分配属性,该属性的值未定义。
(4)如果函数没有返回值,默认返回undefined。
风险值I;I//undefined function f(x){ console . log(x)} f()//undefined var o=new Object();o . p//undinedvar x=f();X //undefined以上是边肖介绍的JS中的call/apply、arguments、undefined/null方法的详细说明,希望对大家有所帮助。
版权声明:JS中调用/应用、参数和未定义/空方法的详细说明是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。