javascript原型和闭包之---Function(六)

还记得声明函数的几种方法吗?

  • 直接声明函数

    function funcName(/*参数列表*/){
        //函数体
    }
    
  • 函数表达式

    var funcName = function(){
    
    };
    
  • Function 类型 new Function

    var func = new Function();

Function可作为构造函数 可以用来新建函数对象

Function构造函数的语法:

  1. 一个参数都不传的情况 创建的就是一个空的函数
    var 函数名 = new Function()
  2. 只传一个参数的情况 这个参数就是函数体
    var 函数名 = new Function(“函数体”)
  3. 传多个参数的情况,最后一个参数为函数体,前面的参数都是该函数的形参名
    //举个栗子
 创建一个计算两个数的和的函数
  var sum = new Function("a", "b", "return a + b;");
  console.log(sum(1, 2));

作为值的函数

     因为ECMAScript中的函数名本身就是变量,所以函数也可以作为来使用。也就是说,不仅可以像传递参数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回。(return 一个函数,闭包用的尤其多,后续解释闭包重点说吧)

function fun(){
            var num = 123;
            return function(a){                              
                    num = a;                               
                    return num;               
            };
    }

函数内部属性

     在函数内部,有两个特殊的对象:arguments和this。

     arguments是一个类数组对象,包含着传入函数中的所有参数。虽然arguments的主要用途是保存函数参数,但这个对象还有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。

function test(a,b){
        console.log(a,b);
        console.log(arguments);
    }
    test();

这里写图片描述
     (1).一个函数有形参的时候,调用的时候,可以不传参数
     (2).一个函数没有形参的时候,调用时后,可以传参 arguments对象
     (3).一个函数不管有没有形参,调用的时候都会把实参的值存入arguments对象
在函数内进行去重操作,然后返回去重后的数组

  var dist = new Function(`
            var arr = [];
            for (var i = 0; i < arguments.length; i++) {
                if(arr.indexOf(arguments[i])==-1){
                    arr.push(arguments[i]);
                }
            }
            return arr;
        `);


        console.log(dist(3, 6, 9, 3, 2, 6));

     this对象引用的是函数执行的环境对象——或者也可以说是this值(当在网页的全局作用域中调用函数时,this对象引用的就是window)。

window.name = "Window";
     var o = {
        name:"kong"
     };

     function  sayName(){
        console.log(this.name);
     }
     o.sayName=sayName;
     o.sayName();//kong

Function的原型

     还记得我们前面说的构造函数吗?构造函数在实例化对象的时候要用new关键字。
     当我们用Function声明函数的时候,用的也是new操作符。

var 函数名 = new Function()

也就是说**函数实际上也是对象,每个函数都是Function类型的实例。
Function这个构造函数也有原型对象,Function.prototype**
这里写图片描述
通过在控制台的输出可以发现:Function的原型对象是一个空函数。
这里写图片描述
           Function的原型对象的原型对象是Object
这句话再解释一遍:原型对象也是对象,每个对象都有一个__proto__属性,可以访问原型对象
Function 的原型对象是:Function.prototype
对象通过__proto__属性访问原型对象也就是 Function.prototype.__proto__

那我们再来看一下,Function的原型对象(Function.prototype)的原型对象(Function.prototype.__proto__)的原型对象(Function.prototype.__proto__.__proto__)是:null
这里写图片描述

发现最后的原型对象为null。 还记得我们在prototype与proto中也打印过,原型对象的终点也是null。
来图回忆一下:
这里写图片描述
有了这些,接下来明白原型链就很容易了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值