资讯专栏INFORMATION COLUMN

【JavaScript】面向对象之Function类型

mingde / 2538人阅读

摘要:一类型概述与函数函数声明方式字面量方式判断函数是否为类型中所有函数都是类型的对象创建类型的对象是个函数函数名参数函数体由于函数的参数和函数体都是以字符串形式传递给以函数方式进行调用属性定义一个构造函数犬夜叉使用构造函数创建对象对象具有与构

JS(JavaScript)

一.Function类型
概述
1.Function与函数;

// 函数声明方式
function fun(){
    console.log("you my function");
}
// 字面量方式
var fn = function(){
    console.log("you my function too");
}
// 判断函数是否为Function类型
console.log(fun instanceof Function);// true
console.log(fn instanceof Function);// true
// JS中所有函数都是Function类型的对象

/*
    3.创建Function类型的对象-是个函数
      var 函数名 = new Function(参数,函数体);
      * 由于函数的参数和函数体都是以字符串形式传递给Function
  */
var f = new Function("a","console.log(a)");
f(100);// 以函数方式进行调用

contstructor属性

// 定义一个构造函数
function Hero(){
    this.name = "犬夜叉";
    this.sayMe = function(){
        console.log("this is function");
    }
}
// 使用构造函数创建对象
var hero = new Hero();
// 对象具有与构造函数相同属性和方法
console.log(hero.name);
hero.sayMe();

// JavaScript中所有对象都是Object类型
console.log(hero.constructor);

Function的length属性

// Function类型的length属性-获取函数的参数(形参)个数

function fn(){
    console.log("you my Inuyasha");
}
fn(1,2,3,4,5);
console.log(fn.length);// 0

2.Function类型;

Function的apply()方法;

以指定this值,调用个函数,数组作为个参数

// 定义函数
function fun(value){
    console.log("this is " + value);
}
// 函数的调用方式
fun("function");// 语法结构:函数名称()
/*
    apply(thisArg,argArray)方法 -> 用于调用一个指定函数
    * 参数
      * thisArg - this
      * argArray - 数组,作为参数(实参)的列表
  */
fun.apply(null, ["function"]);

Function的call()方法;

以指定this值为参数,调用个函数,以及参数列表

// 定义函数
function fun(value, value2){
    console.log("this is " + value);
}
// 函数的调用方式
fun("function", "犬夜叉");// 语法结构:函数名称()

fun.apply(null, ["function","犬夜叉"]);
// call()方法 -> 用于调用一个函数
fun.call(null, "function", "犬夜叉");

Function的bind()方法;

以指定this值为参数,创建个新函数,以及参数列表

// 定义函数
function fun(value){
    console.log("this is " + value);
}
/*
    bind(thisArg, arg1, arg2, ...)方法
    * 作用 - 用于创建一个新函数(称为绑定函数)
    * 参数
      * thisArg - this
      * arg1, arg2, ... - 表示参数列表
    * 返回值 - 返回新的函数
 */
// var f = fun.bind();// 相对于从指定函数复制一份出来
// console.log(f);
// f();

fun("桔梗");// this is 桔梗

var f = fun.bind(null, "犬夜叉");
f();// this is 犬夜叉

没有重载;

在JS中函数是很么重载现象,如果同时定义多个同名函数的话,只有最后一个定义函数是有效的

function add(a,b) {
    return a + b;
}
function add(a,b,c) {
    return a + b + c;
}
function add(a,b,c,d) {
    return a + b + c + d;
}
/*重载含义
* 定义多个同名函数,但具有数量不同的参数
* 调用函数,根据传递参数的个数调用指定函数
 */
add(1,2);
add(1,2,3);
add(1,2,3,4);
//JavaScript函数不存在重载 - 当函数同名时,最后一次定义函数有效
console.log(add(1,2));//NaN
console.log(add(1,2,3));//NaN
console.log(add(1,2,3,4));//10
/*
    重载的含义
    1.定义多个同名的函数,但具有数量不同的参数
    2.调用函数,根据传递参数的个数调用指定的函数
 */
function add(a,b){
    return a + b;
}
function add(a,b,c){
    return a + b + c;
}
function add(a,b,c,d){
    return a + b + c + d;
}

add(1,2);// 3
add(1,2,3);// 6
add(1,2,3,4);// 10

// JavaScript的函数不存在重载 -> 当函数同名时,最后一次定义的函数有效
console.log(add(1,2));// NaN
console.log(add(1,2,3));// NaN
console.log(add(1,2,3,4));// 10

arguments对象
arguments对象也是个类数组对象
length属性-函数实参的个数
用于接收函数参数相当于实参

/*function fn(){
    console.log(arguments[0]);
}
console.log(fn.arguments);// null
fn(1,2,3,4);*/

// 模拟函数的重载效果
function add(){
    var len = arguments.length;
    switch (len) {
        case 2:
            return arguments[0] + arguments[1];
            break;
        case 3:
            return arguments[0] + arguments[1] + arguments[2];
            break;
        case 4:
            return arguments[0] + arguments[1] + arguments[2] + arguments[3];
            break;
    }
}

console.log(add(1,2));// 3
console.log(add(1,2,3));// 6
console.log(add(1,2,3,4));// 10

递归;

在一个函数的函数内部,调用自身函数,有两种方法;
使用自身函数名实现
使用arguments对象的callee属性实现

//函数递归 - 指定函数的函数体中调用自身函数
/*function fun(){
    // 当前函数的逻辑内容
    console.log("you my function");
    // 调用自身函数 -> 实现递归
    fun();
}
fun();
*/

function fn(v) {
    console.log(v);
    if (v >= 10) {
        return;
    }
    arguments.callee(v + 1);
}

var f = fn;
fn = null;
f(0);
// console.log(f);

3.特殊函数;

匿名函数;

函数可以作为数据使用,作为函数自己,跟普通数据一样,不一定有名字

/*
* function (){
*   console.log("you my function");
}*/

/*匿名函数的作用:
    将匿名函数作为参数传递给其他函数 -> 回调函数
    将匿名函数用于执行一次性任务 -> 自调函数
 */

回调函数;

当个函数作为参数传递给另一个函数为回调函数

var one = function () {
    return 1;
}
function fn(v) {
    return v();
}
//one函数是作为fn函数参数出现 - 并不是调用
//var result = fn(one);
/*等价于一些代码*/

var result = fn(function(){return 1;});
console.log(result);//1
/*代码中作为参数函数- 匿名回调函数*/

自调函数;

定义函数后自行调用
第一个小括号- 定义函数
第二个小括号- 调用函数

/*
* 自调函数 - 定义即调用函数
* 第一个小括号- 定义函数
* 第二个小括号- 调用函数
 */
//全局作用域 -生命周期;JS(JavaScript)文件从执行到执行完毕
(function (value) {
    console.log("you my" + value);
    // 函数作用域 -生命周期;从函数调用到调用完毕
})("function");
(function (value){
    console.log("you my" + value);
    // 函数作用域 -生命周期;从函数调用到调用完毕
}("function"));

!function (value) {
    console.log("you my" + value);
    // 函数作用域 -生命周期;从函数调用到调用完毕
}("function");

+function (value) {
    console.log("you my" + value);
    // 函数作用域 -生命周期;从函数调用到调用完毕
}("function");

作为值得函数;

将个函数作为另一个函数的结果进行返回

var one = function () {
    return 100;
}
//作为值得函数 -内部函数的种特殊用法
function fun() {
    var v = 100;

    return function () {
        return v;
    };
}

var result = fun();
console.log(result);//one函数
console.log(result());//100

console.log(fun()());

4.闭包;

作用域链;

一段JS代码,(全局代码和函数)都有个与关联的作用域链,并将作用域是个对象列表和链表

var a = 10;//全局变量
function fun() {
    var b = 100;//fun函数作用域的局部变量
    function fn() {
        var c = 200;//fn函数作用域的局部变量
        function f() {
            var d = 300;//f函数作用域的布部变量
            //调用变量
            console.log(a);//10
            console.log(b);//100
            console.log(c);//200
            console.log(d);//300
        }
        f();
        //调用变量
        console.log(a);//10
        console.log(b);//100
        console.log(c);//200
        console.log(d);//d is not defined

    }
    fn();
    //调用变量
    // console.log(a);//10
    // console.log(b);//100
    // console.log(c);//c is not defined
    // console.log(d);//d is not defined
}
fun();

闭包是什么;

且内部函数可以访问定义在外部函数中的变量和函数,以及外部函数能访问所有变量和函数,外部函数不能访问内部函数中变量和函数

var n;//定义变量,但不初始化值
function fun() {//函数作用域
    var v = 100;
    n = function(){
    //进行初始化值-一个函数
        console.log(v);
    }
}
fun();
n();//100

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/108218.html

相关文章

  • 面向对象JavaScript继承(一) 类式继承

    摘要:那你们肯定会问为什么共用,而没有共用呢,下面就给你解释,请看引用类型是共用的值类型是私用的。 引言 面向对象的编程语言都具继承这一机制,而 JavaScript 是基于原型(Prototype)面向对象程序设计,所以它的实现方式也是基于原型(Prototype)实现的. 继承的方式 类式继承 构造函数继承 组合继承 原型式继承 寄生式继承 寄生组合式继承 1.类式继承 //声明父...

    forsigner 评论0 收藏0
  • javascript面向对象总结

    摘要:之面向对象总结前言在中是没有类的概念的,所以它的对象与基于类的语言中的对象不同。一理解对象张三上面通过构造函数创建了一个对象,并为它添加了三个属性。 JavaScript之面向对象总结 前言:在ECMAScript中是没有类的概念的,所以它的对象与基于类的语言中的对象不同。ECMA-262把对象总结为:无序属性的集合,其属性包含基本值、对象或者函数。 一、理解对象 var person...

    taowen 评论0 收藏0
  • 温故知新javascript面向对象

    摘要:应该非常小心,避免出现不使用命令直接调用构造函数的情况。上面代码表示,使用属性,确定实例对象的构造函数是,而不是。当然,从继承链来看,只有一个父类,但是由于在的实例上,同时执行和的构造函数,所以它同时继承了这两个类的方法。 基本概念 类和实例是大多数面向对象编程语言的基本概念 类:类是对象的类型模板 实例:实例是根据类创建的对象但是,JavaScript语言的对象体系,不是基于类的,...

    赵连江 评论0 收藏0
  • JS面向对象的程序设计继承的实现 - 原型链

    摘要:简单回顾一下构造函数原型和实例对象之间的关系每个构造函数都有一个原型对象。找到生成构造函数的原型对象的构造函数,搜索其原型对象,找到了。 JS面向对象的程序设计之继承的实现 - 原型链 前言:最近在细读Javascript高级程序设计,对于我而言,中文版,书中很多地方翻译的差强人意,所以用自己所理解的,尝试解读下。如有纰漏或错误,会非常感谢您的指出。文中绝大部分内容引用自《JavaS...

    zhaochunqi 评论0 收藏0
  • JS面向对象的程序设计继承-继承的实现-借用构造函数

    摘要:面向对象的程序设计之继承继承的实现借用构造函数前言最近在细读高级程序设计,对于我而言,中文版,书中很多地方翻译的差强人意,所以用自己所理解的,尝试解读下。继承了注意,这一段代码借调了超类型的构造函数。 JS面向对象的程序设计之继承-继承的实现-借用构造函数 前言:最近在细读Javascript高级程序设计,对于我而言,中文版,书中很多地方翻译的差强人意,所以用自己所理解的,尝试解读下...

    duan199226 评论0 收藏0

发表评论

0条评论

mingde

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<