博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Javascript 函数
阅读量:5742 次
发布时间:2019-06-18

本文共 2511 字,大约阅读时间需要 8 分钟。

接上篇,直接条列了:

  1. 每个函数创建时默认带有一个prototype属性,其中包含一个constructor属性,和一个指向Object对象的隐藏属性__proto__。constructor属性的值为该函数的对象。在一个函数前面加上new来调用,则会创建一个隐藏连接到该函数prototype成员的新对象(由__proto__属性来链接),同时函数的this将会被绑定到那个新对象上。
  2. 函数总是返回一个值;如果没有指定返回值,就返回undefined;如果当做构造函数来调用,且返回值不是对象,则返回this(该新对象);如果返回值是对象,则它作为构造函数是没有意义的!
    [javascript]
    1. function A(){  
    2.     this.p = 'haha';  
    3.     return {p:'heihei'};  
    4. }  
    5. var a = new A();  
    alert(a.p);//显示'heihei',与var a = A();的效果一样。
  3. 函数A内部直接调用一个函数B,B的this绑定到全局对象而不是其外部函数A,这是JS设计的一个错误。我们不得不用别的方式来解决这个问题,比如在A中用一个变量(通常是that)来保存A的this作用域的引用。
  4. JS函数拥有一个length属性,表示函数定义时指定的形参的个数。
  5. 函数的arguments属性包含了调用函数时传入的所有参数,而不管函数的声明中是否定义了这些形参;arguments不是数组,只是一个“类似数组”的对象(在函数中运行arguments instanceof Array;返回false)。可以通过Array.prototype.slice.apply(arguments)将其转化为JS数组。
  6. 给JavaScript函数的原型增加方法(method),则所有的(构造)函数都可以用了!例如,可以给JS函数的构造者 Function 的原型增加一个method方法,则包括Object、Number等构造函数在内的所有函数都继承了该方法,这是很强大的:
    [javascript]
    1. Function.prototype.method = function(name, func){  
    2.     this.prototype[name] = func;  
    3.     return this;  
    4. };  
    这样,调用Object.method方法,就可以为所有的JS对象(包括Function对象)增加新的方法,调用Number.method方法,可以为所有的数值类型增加新的方法,下面一条就是这样的一个例子。 注意Object、Number等类型的对象此时并没有继承method方法。如果想达到这样的目的,可以运行类似下面的语句:
    [javascript]
    1. Object.method('method',Object.method);  
  7. 我们可以通过修改数值类型的原型,来给数值类型增加新的方法,这里我们借用上一条中提到的method方法来给Number的原型增加一个negative方法:

     

    [javascript]
    1. Number.method(negative,function(){  
    2.     return 0–this;  
    3. })  
    调用方法的时候稍微有一点绕。在JavaScript的语法中,数字后面直接跟点号,然后跟方法调用的语法是错误的;也就是说,3.negative()这样写是不对的。要想调用数值类型的方法,需要在数字后面加n个空格(n>=1),或者使用小括号将数字括起来,将其强制转化为表达式,然后再调用方法,或者干脆定义一个数值变量,也可以直接调用方法。也就是说,下面的写法都是正确的:
    [javascript]
    1. (3).negative();  
    2. 3 .negative();  
    3. var n = 3; n.negative();  
    4. 3['negative']();     
  8. 当使用函数表达式方法定义函数时,function后面的函数名可以用来递归地调用自己,并且这个名字不会被覆盖!我们来看下面的例子,
    [javascript]
    1. function a(n){  
    2.     if(n>1)  
    3.         return a(n-1)+1;  
    4.     else  
    5.         return 1;  
    6.  };  
    上述代码定义了一个函数a,并且其内部递归对自身进行了调用;现在我们用一个新的引用aa指向函数a,然后将原来的a改变,比如变为一个整数1,然后调用函数aa,如下面代码所示:
    [javascript]
    1. var aa = a;  
    2. a = 1;  
    3. aa(3);  
    则控制台报错:TypeError: Property 'a' of object [object Window] is not a function;很显然,原来的递归函数已经被破坏了。关于这个问题,我们可以在函数a的内部,用arguments.callee.caller来代替a,或者用一个函数表达式来定义函数:
    [javascript]
    1. var b = function a(n){  
    2.     if(n>1)  
    3.         return a(n-1)+1;  
    4.     else  
    5.         return 1;  
    6. };  
    7. var bb = b;  
    8. a = 3;  
    9. bb(3);  
    此时,bb函数能正确返回我们想要的结果。
  9. 为了提高JavaScript函数的封装性,我们可以定义函数化的构造器,下面是一个例子:
    [javascript]
    1. var funcCons = function(spec){  
    2.     var that = {};  
    3.     that.getName = function(){  
    4.         return spec.name;  
    5.     };  
    6.     that.says = function(){  
    7.         return spec.saying || '';  
    8.     };  
    9.     return that;  
    10. };  
    11. var myFunc =  funcCons({name:'NearEast'});  
    这样,我们可以在构造器中定义一些私有变量(如字典表)和函数,而不必把它们全部暴露在外面。

 

转载于:https://www.cnblogs.com/hopeanCom/archive/2012/11/20/2781890.html

你可能感兴趣的文章
FreeNAS8 ISCSI target & initiator for linux/windows
查看>>
cvs文件提交冲突解决方案
查看>>
PostgreSQL数据库集群初始化
查看>>
++重载
查看>>
Rainbond 5.0.4版本发布-做最好用的云应用操作系统
查看>>
nodejs 完成mqtt服务端
查看>>
在ASP.NET MVC 中获取当前URL、controller、action
查看>>
Spring IoC容器初的初始化过程
查看>>
sql server 触发器
查看>>
[工具]前端自动化工具grunt+bower+yoman
查看>>
自动化测试之WatiN(2)
查看>>
关于完成生鲜电商项目后的一点总结
查看>>
noip2012 普及组
查看>>
第二阶段 铁大Facebook——十天冲刺(10)
查看>>
Java判断是否为垃圾_Java GC如何判断对象是否为垃圾
查看>>
多项式前k项和java_多项式朴素贝叶斯softmax改变
查看>>
java数组只能交换0下标和n_编程练习-只用0交换排序数组
查看>>
centos7安装mysql视频教程_centos7安装mysql(完整)
查看>>
php图片赋值,php如何优雅地赋值
查看>>
如何解决OutOfMemoryError
查看>>